栈,后进先出,两步骤:
1.PUSH,对栈进行insert操作,PUSH多了则上溢
2.POP,无参数的对栈进行delete操作,POP空栈则下溢
实现按链表形式实现,具体问题与队列类似,插入、查找、删除则类似链表。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
///
//定义链栈的结构类型
typedef struct StackNode
{
ElemType data; //栈的数据
struct StackNode *next; //指针域
} StackNode,*LinkStack;
//
//链栈的初始化
LinkStack LinkStackInit()
{
LinkStack top; //构造一个空栈
top = (StackNode *)malloc(sizeof(StackNode));
if(!top)
printf("OVERFLOW\n");
top = NULL;
return top;
}
/
//判断栈空的算法
int LinkStackEmpty(LinkStack top)
{
if(!top)
return 1;
else
return 0;
}
//进栈
LinkStack LinkStackPush(LinkStack top,ElemType x)
{
LinkStack p;
p = (StackNode *)malloc(sizeof(StackNode)); //创建一个结点
p->data = x; //设置结点的数据域
p->next = top; //设置结点的指针域
top = p; //设置新的栈顶
return top;
}
//出栈
ElemType LinkStackPop(LinkStack &top)//出栈的时候必须判断是否栈空
{
LinkStack p;
ElemType x;
if(top != NULL)
{
x = top->data; //取栈顶元素
p = top; //将栈顶结点重置
top = top->next;
free(p); //释放原栈顶结点空间
}
else
printf("stack empty!\n");
return x;
}
int main()
{
LinkStack lstack;
lstack = LinkStackInit();
ElemType x;
printf("请输入进栈的元素:");
while(scanf("%d",&x) != EOF)
{
lstack = LinkStackPush(lstack,x);
}
LinkStack p;
for(p = lstack;p != NULL; p = p->next)
printf("%d ",p->data);
printf("出栈的结果为:");
while(lstack != NULL)
printf("%d ",LinkStackPop(lstack));
return 0;
}