数据结构的题目
编写程序实现对链栈的操作
- 提问者网友:温柔港
- 2021-04-20 20:16
- 五星知识达人网友:痴妹与他
- 2021-04-20 21:34
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int StackElementType;
typedef struct LinkStackNode
{
StackElementType data;
struct LinkStackNode *next;
}LinkStackNode;
typedef struct
{
struct LinkStackNode *top; //栈顶指针
}LinkStack;
void InitStack(LinkStack *s)//初始化链栈
{
s->top=NULL;
printf("\n已经初始化链栈!\n");
}
void ClearStack(LinkStack *s)//链栈置空
{
s->top=NULL;
printf("\n链栈被置空!\n");
}
void Push(LinkStack *s, StackElementType x)//入栈
{
LinkStackNode *p;
p=(LinkStackNode *)malloc(sizeof(LinkStackNode)); //建立一个节点
p->data=x;
p->next=s->top; //由于是在栈顶Push,所以要指向栈顶
s->top=p; //插入
}
StackElementType Pop(LinkStack *s)//出栈
{
StackElementType x;
LinkStackNode *p;
p=s->top; //指向栈顶
if (s->top==0)
{
printf("栈空,不能出栈!\n");
exit(-1);
}
x=p->data;
s->top=p->next; //当前的栈顶指向原栈的next
free(p); //释放
return x;
}
StackElementType GetTop(LinkStack *s)//取栈顶元素
{
if (s->top==0)
{
printf("链栈为空,无栈顶元素!\n");
exit(-1);
}
return s->top->data;
}
void Disp(LinkStack *s)//链栈的遍历
{
printf("\n当前链栈中的数据为:\n");
printf("=====================\n");
LinkStackNode *p;
p=s->top;
while(p!=NULL)
{
printf("\t| %d |\n",p->data);
p=p->next;
}
printf("=====================\n");
}
void main()
{
int cord;
int i,m,n,a;
LinkStack *s;
s=(LinkStack *)malloc(sizeof(LinkStack));
printf("================= 链栈操作=================\n");
printf("\t 第一次使用必须初始化!\n");
do
{
printf("\n");
printf("\n == 主菜单 == ");
printf("\n 1 初始化链栈 ");
printf("\n 2 入栈 ");
printf("\n 3 出栈 ");
printf("\n 4 取栈顶元素 ");
printf("\n 5 置空链栈 ");
printf("\n 6 结束程序运行 \n");
printf("\n===============================\n");
printf("请输入您的选择(1,2,3,4,5,6)");
scanf("%d",&cord);
printf("\n");
switch(cord)
{
case 1:
{
InitStack(s);
Disp(s);
}break;
case 2:
{
printf("输入将要压入链栈的数据的个数:n=");
scanf("%d",&n);
printf("依次将%d个数据压入链栈:\n",n);
for(i=1;i<=n;i++)
{
printf("请输入第%d个数据:",i);
scanf("%d",&a);
Push(s,a);
}
Disp(s);
}break;
case 3:
{
printf("\n出栈操作开始!\n");
printf("输入将要出栈的数据个数:m=");
scanf("%d",&m);
for(i=1;i<=m;i++)
{
printf("\n第%d次出栈的数据是:%d",i,Pop(s));
}
Disp(s);
}break;
case 4:
{
printf("\n\n链栈的栈顶元素为:%d\n",GetTop(s));
printf("\n");
}break;
case 5:
{
ClearStack(s);
Disp(s);
}break;
case 6:
exit(0);
}
}while (cord<=6);
}