#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1
#define MAXSIZE 10
typedef int Status;
typedef struct Node{
int data; //结点的数据域
struct Node *next;//结点的指针域
int stacksize;
}Node,*LinkList;
int i=0;//记录栈中数据个数
void ShowMenu()
{
printf("\n");
printf("\n****************链栈基本操作****************\n\n");
printf("\t\t1 数据入栈\n");
printf("\t\t2 数据出栈\n");
printf("\t\t3 读取栈顶元素\n");
printf("\t\t4 遍历输出栈中所有元素\n");
printf("\t\t5 清除栈中数据\n");
printf("\t\t6 判断是否栈空\n");
printf("\t\t7 判断是否栈满\n");
printf("\t\t8 销毁当前栈\n");
printf("\t\t9 清空当前栈\n");
printf("\t\t0 退出系统\n");
printf("\n****************链栈基本操作****************\n\n");
printf("\n");
}
//功能:带表头的链栈初始化
Status Init_Stack(LinkList &S)
{
S = (LinkList)malloc(sizeof(Node));
if(!S)
return ERROR;
S->next = NULL;
Node Node3;
Node3.stacksize=MAXSIZE;
return OK;
}
//功能:入栈操作
Status Push_Stack(LinkList &S,int e)
{
if(i<10)
{
LinkList p = (LinkList)malloc(sizeof(Node));
if(!p)
return ERROR;
p->data = e;
p->next = S->next;
S->next = p;
i++;
return OK;
}
else printf("当前栈已满,别输入了!");
return NULL;
}
//功能:出栈操作
Status Pop_Stack(LinkList &S)
{
LinkList p = S->next;
if(!p)
return ERROR;
S->next = p->next;
free(p);
i--;
return OK;
}
//功能:取栈顶元素
int Top_Stack(LinkList S)
{
LinkList p = S->next;
if(!p)
return ERROR;
return p->data;
}
//功能:输出栈中所有元素
Status All_Stack(LinkList S)
{
int a = 0;
LinkList p = S->next;
if(!p)
return ERROR;
while(p)
{
printf("第%d个元素为:%d\n",++a,p->data);
p = p->next;
}
return OK;
}
//清空栈
Status Clear_Stack(LinkList &S)
{
LinkList p = S->next;
if(!p)
return ERROR;
while(p)
{
LinkList q = p;
p = p->next;
free(q);
}
//
S->next = NULL;
i=0;
return OK;
}
//栈满判断
void full_Stack()
{
if(i==10) printf("当前栈已满!");
else printf("当前栈不满!");
}
//栈空判断 不用写函数
//销毁栈
void Destory_Stack(LinkList &S)
{
if(!S) printf("没有栈可销毁!");
else
{
free(S);
S=NULL;
printf("当前栈已销毁!");
}
}
int main()
{
int num;
LinkList S;
int choice;
if(Init_Stack(S) ==ERROR)
exit(0);
while(1)
{
ShowMenu();
printf("Which is your choice:");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("请输入入栈元素:\n");
scanf("%d",&num);
if(Push_Stack(S,num)==OK)
printf("数据入栈成功!\n");
getchar();getchar();
system("cls");
break;
case 2:
if(Pop_Stack(S)==ERROR)
printf("栈空,无法出栈!\n");
else
printf("出栈成功!\n");
getchar();getchar();
system("cls");
break;
case 3:
if(Top_Stack(S)==ERROR)
printf("栈空,无法访问栈顶元素!\n");
else
printf("栈顶元素为:%d\n",Top_Stack(S));
getchar();getchar();
system("cls");
break;
case 4:
if(All_Stack(S)==ERROR)
printf("栈空,无法输出栈中元素!\n");
else
printf("输出成功!\n");
getchar();getchar();
system("cls");
break;
case 5:
if(Clear_Stack(S)==ERROR)
printf("栈已经为空,不用再次清空!\n");
else
printf("栈元素清空成功!\n");
getchar();getchar();
system("cls");
break;
case 0:
printf("退出成功!\n");
exit(0);
case 6:
if(Pop_Stack(S)==ERROR) printf("当前栈空!");
else printf("当前栈不空!");
getchar();getchar();
system("cls");
break;
case 7:
full_Stack();
getchar();getchar();
system("cls");
break;
case 8:
Destory_Stack(S);
getchar();getchar();
system("cls");
break;
case 9:
if(Clear_Stack(S)==OK) printf("当前栈已清空!");
else printf("当前栈已为空栈!");
getchar();getchar();
system("cls");
break;
default:
printf("输入错误,请重新输入!\n");
getchar();getchar();
system("cls");
}
}
return 0;
}
数据结构作业 栈的操作
最新推荐文章于 2023-10-19 21:08:17 发布