#include<stdio.h>
#include<stdlib.h>
typedef struct linknode{
int data;
struct linknode *next;
}LinkStack;
void InitStack(LinkStack *&s){
s=(LinkStack *)malloc(sizeof(LinkStack));
s->next=NULL;
}
bool StackEmpty(LinkStack *s){
return (s->next==NULL);
}
void PushStack(LinkStack *&s,int x){
if(s->next=NULL)
return ;
LinkStack *q;
q=(LinkStack *)malloc(sizeof(LinkStack));
q->data=x;
q->next=s->next;
s->next=q;
}
void PopStack(LinkStack *&s,int &x){
LinkStack *q=s->next;
x=s->next->data;
s->next=q->next;
free(q);
}
void GetTop(LinkStack *s,int &x){
if(s->next==NULL)
return ;
x=s->next->data;
}
void AlterStack(LinkStack *&s,int x){
if(s->next==NULL)
return ;
s->next->data=x;
}
void DestroyStack(LinkStack *&s){
LinkStack *q;
while(s){
q=s->next;
free(s);
s=q;
}
}
int main(){
LinkStack *s;
int a,x,e;
printf("<--------链栈的基本操作--------->\n");
printf("1:初始化链栈\n");
printf("2:判断链栈是否为空\n");
printf("3:入栈操作\n");
printf("4:出栈操作\n");
printf("5:读取栈顶元素\n");
printf("6:销毁栈\n");
printf("7:修改栈顶元素\n");
while(1){
printf("请输入要执行操作的序号:");
scanf("%d",&a);
switch(a){
case 1:InitStack(s);
printf("初始化栈成功\n");
break;
case 2:if(StackEmpty(s))
printf("该栈为空\n");
else
printf("该栈不为空\n");
break;
case 3:printf("请输入要入栈的数据\n");
scanf("%d",&x);
PushStack(s,x);
printf("入栈成功\n");
break;
case 4:PopStack(s,x);
printf("出栈的数据是:%d\n",x);
break;
case 5:GetTop(s,e);//不用x是因为之前已经给x赋值了,所以继续会导致数据是之前的
printf("栈顶元素是:%d\n",e);
break;
case 6:DestroyStack(s);
printf("销毁栈成功\n");
break;
case 7:printf("要修改的栈顶元素值是:");
scanf("%d",&x);
AlterStack(s,x);
printf("修改成功\n");
break;
}
}
return 0;
}