作者:兰勇2502919543 | 来源:互联网 | 2024-10-27 16:07
在考研数据结构复习中,链式栈的深入解析与应用是一个重要环节。本文详细探讨了链式栈的实现方法,特别是栈底和栈顶指针的使用。通过对比常见的单链表实现方式,本文整理了一份代码示例,与王道复习指导中的链式存储类型高度一致。此外,本文还提供了详细的注释和解释,帮助读者更好地理解和掌握链式栈的原理与应用。
参考网上的内容,大部分的链栈实现用到了栈底和栈顶两个指针,而下文整理的这份代码,基本上与单链表的实现方式如出一辙。
与王道复习指导上给的栈的链式存储类型相一致。
#include
#include<malloc.h>
typedef struct Linknode{
int data;
struct Linknode *next;
}Linknode,*LiStack;
/* -1- 初始化链栈*/
bool InitStack(LiStack S){
S->next = NULL;
return true;
}
/* -2- 判断是否栈空*/
bool StackEmpty(LiStack S){
if(S->next == NULL){
printf("空栈!\n");
return true;
}
else{
return false;
}
}
/* -3- 进栈(插入元素)*/
bool Push(LiStack S,int e){
Linknode *temp;
temp = (Linknode*)malloc(sizeof(Linknode));
temp->data = e;//!1
temp->next = S->next;//!2
S->next = temp;//!3
//!!!S->next是首元节点
return true;
}
/* -4- 读取栈顶元素*/
int GetTop(LiStack S,int e){
if(!StackEmpty(S)){
e = S->next->data;//!4
}
else{
return false;
}
return e;
}
/* -5- 出栈*/
bool Pop(LiStack S,int e)
{
Linknode *temp = S->next;
e = temp->data;
S->next = temp->next;
free(temp);
return true;
}
int main(){
LiStack S;
S = (LiStack)malloc(sizeof(Linknode));
InitStack(S);
int l;
printf("请输入元素个数:\n");
scanf("%d",&l);
printf("请依次输入:\n");
for(int i=0; i){
int m;
scanf("%d",&m);
Push(S,m);
}
int flag;
printf("请进行选择:\n");
printf("==1.栈顶元素:\n");
printf("==2.依次输出栈内元素:\n");
scanf("%d",&flag);
switch(flag){
case(1):
{
int e;
printf("当前栈顶元素为:%d\n",GetTop(S,e));
break;
}
case(2):
{
int i=0;
while(l > 0)
{
int n;
printf("经过第%d次出栈操作后,当前栈顶元素为:%d\n",i,GetTop(S,n));
Pop(S,n);
l--;
i++;
}
printf("结束!\n");
break;
}
}
return 0;
}
最终结果: