仅供参考
/*
时间: 2020/09/24 15:00
目的:链栈的C语言算法演示
功能:了解压栈,出栈,输出栈,clear等操作
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int date;
struct node *pNext;
}NODE,*PNODE;
typedef struct stack{
PNODE pTop;
PNODE pBottom;
}STACK,*PSTACK;
void init(PSTACK);//创建一个空栈
void push(PSTACK,int);//压栈
void pop(PSTACK);//出栈
void traverse(PSTACK);//将栈的元素进行输出
bool empty(PSTACK);//判断是否为空栈
void clear(PSTACK);//将栈清空
int main()
{
STACK S;
init(&S);//创建一个空栈
//以下五行进行五次压栈操作
push(&S,1);
push(&S,2);
push(&S,3);
push(&S,4);
push(&S,5);
//将栈的元素进行输出
traverse(&S);
//以下两行进行出栈操作
pop(&S);
pop(&S);
traverse(&S);
clear(&S);//将栈清空
traverse(&S);
pop(&S);
return 0;
}
void init(PSTACK pS){
//将栈顶指针和栈底指针指向同一个空结点
pS->pTop=(PNODE)malloc(sizeof(NODE));
pS->pBottom=pS->pTop;
}
void push(PSTACK pS,int val){
PNODE pNew=(PNODE)malloc(sizeof(NODE));
pNew->date=val;
pNew->pNext=pS->pTop;//使新结点指向前一个结点
pS->pTop=pNew;//使栈顶指针指向新结点
}
void pop(PSTACK pS){
PNODE p=pS->pTop;
if(empty(pS)==true){
pS->pTop=p->pNext;//将栈顶指针指向后一个结点完成出栈
printf("出栈成功,出栈的数据是:%d\n",p->date);
free(p);
}
else
printf("出栈失败!\n");
}
void traverse(PSTACK pS){
PNODE p=pS->pTop;
while(p!=pS->pBottom){
printf("%d ",p->date);
p=p->pNext;
}
printf("\n");
}
bool empty(PSTACK pS){
if(pS->pTop==pS->pBottom)//栈顶指针和栈底指针相等则为空栈
return false;
else
return true;
}
void clear(PSTACK pS){
//定义两个指针方便进行操作
PNODE p=pS->pTop;
PNODE q=NULL;
//使用while循环进行清空操作
while(p!=pS->pBottom){
q=p->pNext;
pS->pTop=q;
free(p);
p=q;
q=q->pNext;
}
}
/*
总结:搞清楚链栈各个操作的原理做到心中有数
-----------------------
在dev中输出结果为
5 4 3 2 1
出栈成功,出栈的数据是:5
出栈成功,出栈的数据是:4
3 2 1
出栈失败!
正确
-----------------------
*/