您的位置:首页 > 其它

实验3_2 实现链栈各种基本运算的算法

2018-02-01 16:47 405 查看
/*现在构造链栈的各种基本运算的方法
Time:2018-2-1;
Author:ZouJiXiang;
school:imnu
*/
#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct linknode{
ElemType data;
struct linknode* next;
}LiStack;
void InitStack(LiStack * & s){
s=(LiStack*)malloc(sizeof(LiStack));  //动态分配存储空间;
s->next=NULL;
}
void DestroyStack(LiStack*& s)
{  //毁灭栈;
LiStack *p=s,*q=s->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}

void Push(LiStack*& s,ElemType e)
{
LiStack *p;
p=(LiStack*)malloc(sizeof(LiStack)); //动态分配;
p->data=e;
p->next=s->next;  //进栈的关键操作,采用头插法,最后面进来的结点放在最前面(也就是s->next,因为s头结点不存信息);
s->next=p;
}

bool Pop(LiStack*& s,ElemType& e){  //栈的原则满足后进先出;
LiStack * p;
if(s->next==NULL){
return false;
}
p=s->next; //头结点的下一个节点;
e=p->data;
s->next=p->next;
free(p); //本质也就是将S->next节点给删掉了;
return true;
}

bool StackEmpty(LiStack* s){
if(s->next==NULL)
return true;
else
return false;
}

ElemType Gettop(LiStack* s)  //将栈顶元素返回出来;注意此处不用加&,因为栈s不会改变。
{
LiStack * p;
p=s->next;
return p->data;
}

int main()
{
LiStack* s; //定义一个类型为LiStack* 名字为s;
ElemType e;
InitStack(s); //这是关键,千万别忘了;
Push(s,'a');
Push(s,'b');
Push(s,'c');
Push(s,'d');
printf("输出栈顶元素:\n");
printf("%c\n",Gettop(s));
while(!StackEmpty(s))
{
Pop(s,e);
printf("%c ",e);
}
printf("\n");
//printf("输出栈顶元素:\n");
//printf("%c\n",Gettop(s)); //不能放在这里,是因为此处栈中的元素已经全部都出去了;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: