#include <bits/stdc++.h>
using namespace std;
typedef struct node
{
int data;//数据
struct node *next;//指针域
}node;
typedef struct Linkedstrack
{
node *top;
int size;
}Linkedstrack;
//栈的链式初始化
void initstrack(Linkedstrack *pstrack)
{
pstrack->top=NULL;
pstrack->size=0;
}
//清空栈
void emptystrack(Linkedstrack *pstrack)
{
//判断栈是否为空
if(pstrack->size==0)
{
printf("栈已为空!\n");
exit(-1);//perror(".....");
}
while(pstrack->size)
{
node *p=pstrack->top;
pstrack->top=pstrack->top->next;
free(p);
pstrack->size--;
}
}
//销毁栈
void destorystrack(Linkedstrack *pstrack)
{
free(pstrack);
return;
}
//栈空的判断
bool isempty(Linkedstrack strack)
{
return strack.size==0;
}
//栈空的判断
void whetherempty(Linkedstrack strack)
{
if(isempty(strack)) printf("该栈为空!\n");
else printf("该栈不为空!\n");
}
//栈满的判断
node *isfull()
{
node *newNode=(node*)malloc(sizeof(node));
if(newNode==NULL)
{
printf("分配内存失败!栈满\n");
exit(-1);
}
else printf("栈未满\n");
return newNode;
}
//入栈
void push(Linkedstrack *pstrack)
{
int data;
printf("请输入入栈元素:\n");
scanf("%d",&data);
node *newNode;
newNode=isfull();//判断栈满,栈未满时创建一个新结点
newNode->data=data;
newNode->next=pstrack->top;
pstrack->top=newNode;
pstrack->size++;
}
//出栈
void pop(Linkedstrack *pstrack)
{
int temp;
//判断栈是否为空
if(pstrack->size==0)
{
printf("栈为空,无法弹出!\n");
exit(-1);//perror(".....");
}
node *p;
p=pstrack->top;
temp=pstrack->top->data;
pstrack->top=pstrack->top->next;
free(p);
pstrack->size--;
printf("出栈元素为:%d\n",temp);
}
//得到栈顶元素
void searchtop(Linkedstrack strack)
{
//判断栈是否为空
if(isempty(strack))
{
printf("栈为空,无法找到栈顶元素!\n");
exit(-1);//perror(".....");
}
printf("栈顶元素为:%d\n",strack.top->data);
}
//栈的遍历
void printstract(Linkedstrack strack)
{
//判断栈是否为空
if(isempty(strack))
{
printf("栈为空,无法遍历!\n");
exit(-1);//perror(".....");
}
node *p;
p=strack.top;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//菜单
void menu()
{
printf("********1.清空栈 2.销毁栈*********\n");
printf("********3.退出 4.入栈*********\n");
printf("********5.出栈 6.得到栈顶元素********\n");
printf("********7.栈的遍历 8,判断栈是否为空********\n");
}
//主函数
int main()
{
Linkedstrack Linkedstrack ;
initstrack(&Linkedstrack);//初始化
int choice;
while(1)
{
menu();
printf("请输入菜单序号:\n");
scanf("%d",&choice);
if(choice==3) break;
switch(choice)
{
case 1:emptystrack(&Linkedstrack);break;
case 2:destorystrack(&Linkedstrack);break;
case 4:push(&Linkedstrack);break;
case 5:pop(&Linkedstrack);break;
case 6:searchtop(Linkedstrack);break;
case 7:printstract(Linkedstrack);break;
case 8:whetherempty(Linkedstrack);break;
default:printf("输入错误!!!\n");
}
}
return 0;
}