#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct snode{
int data;
struct snode* next;
}snode;
typedef struct linkstack{
snode* top;
snode* bottom;
int length;
}linkstack;
Status creat(linkstack* S){//创建一个空栈
S->top=S->bottom=(snode*)malloc(sizeof(snode));
if(!S->top){
printf("申请空间失败!\n");
return ERROR;
}
S->top->next=NULL;
S->bottom->next=NULL;
S->length=0;
return OK;
}
bool empty(linkstack S){//判断栈是否为空
return !S.length;
}
int size(linkstack S){//返回栈的大小
return S.length;
}
Status push(linkstack* S,int e){//元素入栈
snode* newx=(snode*)malloc(sizeof(snode));
if(!newx){
printf("申请空间失败!\n");
return ERROR;
}
newx->data=e;
newx->next=S->top->next;
S->top->next=newx;
if(!S->length)
S->bottom=S->bottom->next;
S->length++;
return OK;
}
Status pop(linkstack* S){//弹出栈顶元素
if(!S->length){
printf("当前栈已经为空!\n");
return ERROR;
}
snode* del=S->top->next;
S->top->next=del->next;
free(del);
S->length--;
return OK;
}
Status gettop(linkstack S,int &e){//获得栈顶元素 存到e中
if(!S.length){
printf("当前栈为空!\n");
return ERROR;
}
e=S.top->next->data;
return OK;
}
Status show(linkstack S){//输出当前栈的内容
if(!S.length){
printf("空!\n");
return ERROR;
}
snode* p=S.top->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return OK;
}
Status clear(linkstack *S){//清空栈
while(S->top->next)
pop(S);
return OK;
}
Status destroy(linkstack* S){//销毁当前栈
snode* del;
while(S->top){
del=S->top;
S->top=S->top->next;
free(del);
}
S->top=S->bottom=NULL;
return OK;
}
void menu(){
printf("\t\t\t\t**********链栈操作程序**********\n");
printf("\t\toptions:\n");
printf("\t\t\t1、搭建一个栈\n");
printf("\t\t\t2、向当前栈中压入元素\n");
printf("\t\t\t3、输出当前栈的内容\n");
printf("\t\t\t4、输出栈顶元素\n");
printf("\t\t\t5、弹出栈顶元素\n");
printf("\t\t\t6、查询当前栈的元素数目\n");
printf("\t\t\t7、判断当前栈是否为空\n");
printf("\t\t\t8、清空栈的内容\n");
printf("\t\t\t9、销毁当前栈\n");
printf("\t\t\t0、退出对栈的操作\n");
printf("\t\t请输入你的选项: ");
}
int main()
{
linkstack S;
creat(&S);
while(1){
menu();
int op;
int n,m;
int e;
scanf("%d",&op);
switch(op){
case 0:{
system("cls");
printf("\t\t\t谢谢您的操作,再见!\n");
exit(0);
break;
}
case 1:{
system("cls");
creat(&S);
printf("\t\t\t搭建成功!\n");
break;
}
case 2:{
system("cls");
printf("\t\t\t请输入要将几个元素入栈:");
scanf("%d",&n);
printf("\t\t\t输入%d个需要入栈的元素:",n);
while(n--){
scanf("%d",&e);
push(&S,e);
}
system("cls");
printf("\t\t元素入栈成功!\n");
break;
}
case 3:{
system("cls");
printf("\t\t\t当前栈的内容为:\n\t\t\t");
show(S);
break;
}
case 4:{
system("cls");
if(gettop(S,e))
printf("\t\t\t当前栈顶元素为 %d\n",e);
break;
}
case 5:{
system("cls");
pop(&S);
printf("\t\t\t栈顶元素弹出成功\n");
break;
}
case 6:{
system("cls");
printf("\t\t\t当前栈的元素数目为%d个\n",size(S));
break;
}
case 7:{
system("cls");
if(empty(S))
printf("\t\t\t当前栈为空!\n");
else printf("\t\t\t当前栈不为空!\n");
break;
}
case 8:{
system("cls");
clear(&S);
printf("\t\t\t当前栈已经被清空!");
break;
}
case 9:{
system("cls");
destroy(&S);
break;
}
default:
system("cls");
printf("\t\t你的输入有误,请重新输入!!!\n");
break;
}
printf("\n");
}
return 0;
}