数据结构(链栈)
数据结构(链栈)
数据结构教程(第6版)118页2
主函数
//
// Created by Snow on 2023/3/9.
//
#include"listack.cpp"
int main()
{
int choice;
LinkStNode *s=nullptr;
PrintCommand();
while(1)
{
printf("\n请输入下一个操作:\n");
scanf("%d",&choice);
Choice(s,choice);
}
}
实现函数
//
// Created by Snow on 2023/3/9.
//
#include<cstdio>
#include<windows.h>
typedef char ElemType;
typedef struct LinkNode
{
ElemType data;//存放栈中的数据元素
struct LinkNode *next;//栈顶指针,即存放栈顶元素在data数组中的下标
}LinkStNode;//顺序栈类型
//打印菜单
void PrintCommand()
{
printf(" 欢迎使用链栈操作系统\n\n");
printf("1.初始化栈s 2.判断栈s是否非空\n");
printf("3.依次进栈元素a,b,c,d,e 4.判断栈s是否非空\n");
printf("5.输出出栈序列 6.判断栈s是否非空\n");
printf("7.释放栈 0.结束程序\n");
}
bool InitStack(LinkStNode *&s)
{
if(s!=nullptr)
{
printf("此栈已存在!\n");
return false;
}
s=(LinkStNode *)malloc(sizeof(LinkStNode));//分配一个顺序栈空间,首地址存放在s中
if(s==nullptr)
{
printf("栈初始化失败!\n");
return false;
}
s->next= nullptr;
return true;
}
bool DestroyStack(LinkStNode *&s)
{
if(s==nullptr)
{
printf("栈不存在!\n");
return false;
}
LinkStNode *pre=s,*p=s->next;
while(p!=nullptr)
{
free(pre);
pre=p;
p=p->next;
}
free(pre);
return true;
}
bool StackEmpty(LinkStNode *s)
{
if(s==nullptr)
{
printf("栈不存在!\n");
return false;
}
if(s->next==nullptr)
printf("空栈!\n");
else
printf("栈中已含有数据!\n");
return true;
}
bool Push(LinkStNode *&s,ElemType e)
{
if(s==nullptr)
{
printf("栈不存在!\n");
return false;
}
LinkStNode *p;
p=(LinkStNode *)malloc(sizeof(LinkStNode));
p->data=e;
p->next=s->next;
s->next=p;
return true;
}
bool Pop(LinkStNode *&s,ElemType &e)
{
if(s==nullptr)
{
printf("栈不存在!\n");
return false;
}
if(s->next==nullptr)
{
printf("栈已空!\n");
return false;
}
LinkStNode *p=s->next;
e=p->data;
s->next=p->next;
free(p);
return true;
}
//选择操作
bool Choice(LinkStNode *&s, int i)
{
bool OK;
int j;
ElemType e,arr[]{'a','b','c','d','e'};
switch(i)
{
case 1:
OK=InitStack(s);
if(OK)printf("初始化操作成功!\n");
else printf("初始化操作失败!\n");
break;
case 2:
OK=StackEmpty(s);
if(OK)printf("判断栈操作成功!\n");
else printf("判断栈操作失败!\n");
break;
case 3:
for(j=0;arr[j]!='\0';j++)
{
OK=Push(s,arr[j]);
if(OK)printf("进栈操作成功!\n");
else printf("进栈操作失败!\n");
}
break;
case 4:
OK=StackEmpty(s);
if(OK)printf("判断栈操作成功!\n");
else printf("判断栈操作失败!\n");
break;
case 5:
while(s->next!=nullptr)
{
OK=Pop(s,e);
printf("%c ",e);
}
printf("\n");
if(OK)printf("输出出栈序列操作成功!\n");
else printf("输出出栈序列操作失败!\n");
break;
case 6:
OK=StackEmpty(s);
if(OK)printf("判断栈操作成功!\n");
else printf("判断栈操作失败!\n");
break;
case 7:
OK= DestroyStack(s);
if(OK)printf("销毁栈操作成功!\n");
else printf("销毁栈操作失败!\n");
break;
case 0:
printf("感谢使用!下次再见!\n");
system("pause");
exit(0);
default:printf("指令错误,请再尝试一次\n");
}
}
GBK编码
ps:我是菜狗