可以正常运行的代码,完整准确的类C语言
简介
链栈:运算是受限的单链表,栈的链式存储结果,只能在链表头部(栈顶)进行操作,所以没有必要附加头结点,栈顶指针就是头指针
是一种后进先出的线性表LIFO结构
空栈:不含任何元素的栈称为空栈
代码区
#include<stdio.h>
#include<stdlib.h>
typedef int SElemType;
typedef struct StackNode
{
SElemType data; //数据域
struct StackNode *next; //指针域
}StackNode,*LinkStack;
enum Status{ERROR,OK}; //定义枚举类型,此处也可换为布尔类型的TRUE,FALSE
//链栈初始化
Status InitStack(LinkStack &S)
{
S=NULL; //S为空指针; 区分野指针:没有任何值指向,野指针是不允许的
return OK;
}
//判断链栈是否为空
Status StackEmpty(LinkStack S)
{
if(S==NULL) //top=NULL也可
return OK;
else
return ERROR;
}
//链栈进栈--压栈--就是插入的操作
Status Push(LinkStack &S,SElemType e)
{
LinkStack p=new StackNode; //生成新结点p
if(!p)
return ERROR;
p->data=e; //没有链栈满不满这一说法,因为链栈不是连续的
p->next=S;
S=p;
}
//链栈出栈--弹栈--删除的操作
Status Pop(LinkStack &S,SElemType &e)
{
LinkStack p;
if(S==NULL)
return ERROR; //栈空
e=S->data;
p=S;
S=S->next;
delete p; //释放p空间。注意:delete 与new 对应使用;free与malloc对应使用
return OK;
}
//取链栈栈顶元素
SElemType GetTop(LinkStack S)
{
if(S=NULL)
return ERROR;
else
return S->data;
}
int main()
{
LinkStack S;
SElemType e;
int n,a;
InitStack(S); //初始化
printf("input the number you want to push\n"); //输入进栈的元素个数
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&e); //依次输入元素
Push(S,e); //入栈
}
a=GetTop(S); //取栈顶元素
printf("the element of top is %d\n",a);
printf("now,look at all these elements\n");
while(!StackEmpty(S)) //若栈非空
{
Pop(S,e); //出栈
printf("%d ",e);
}
return 0;
}