一.栈的定义
栈是一种先进后出的线性表,只能在表尾进行插入和删除,有链式栈和顺序栈两种结构。
链式栈的构造似乎没有明确规定表尾表头,所以有的链式栈的构造是使用头插法插入元素,将其栈顶top指向头结点作为表尾;有的则是使用尾插法插入,在最后节点进行插入删除操作,top指向为尾节点作为表尾。
无论哪种方式,原理都是一样的:栈只能在表尾(一端)进行插入删除操作,先进后出,后进先出!
二.栈的节点类型构造
说明:我这里是将top栈顶指针指向尾节点作为表尾。
------SNode结构体是节点类型,分别记录节点的上下逻辑位置以及保存数据
------LinkedStack类型是链式栈的头,类似于链表的头结点,记录了栈中元素个数。
三.链式栈的相关操作
1.创建一个空栈
2.入栈,从栈顶插入一个元素
3.出栈,从栈顶删除一个元素,并将该元素的数据通过形参指针返回给主调函数
4.判断栈是否为空,为空返回1,非空返回0
5.获取栈顶元素,只获取元素的数据,不删除元素
6.清空栈
7.销毁栈
四.测试
int main(void)
{
LinkedStack * s = NULL;
int num = 0;
/* 1.创建一个新的栈 */
s = LinkedStack_create();
while(1)
{
scanf("%d",&num);
if(0 == num)
{
break;
}
/* 将从键盘输入的数据入栈 */
LinkedStack_Push(s,num);
}
//获取栈顶元素
LinkedStack_GetPop(s,&num);
printf("栈顶元素:%d\n",num);
//依次将队列中的数据出队
while(!LinkedStack_IsEmpty(s))
{
LinkedStack_Pop(s,&num);
printf("%d ",num);
}
printf("\n");
}
创建一个链式栈,输入数据,输入0表示人为结束添加节点元素。
结果:
输入 5 6 2 4 9 4 0
0------表结束
输出栈顶元素为4,然后依次出栈,先进后出
出栈顺序为: 4 9 4 2 6 5 符合预期