数据结构栈子系统.docx
《数据结构栈子系统.docx》由会员分享,可在线阅读,更多相关《数据结构栈子系统.docx(11页珍藏版)》请在冰豆网上搜索。
![数据结构栈子系统.docx](https://file1.bdocx.com/fileroot1/2023-1/23/455308d8-48b4-4f8b-9b46-08cb02a942b0/455308d8-48b4-4f8b-9b46-08cb02a942b01.gif)
数据结构栈子系统
/*
*题目:
设计一个字符型的链栈。
*编写进栈、出栈、显示栈中全部元素的程序。
*题目:
编写一个把十进制整数转换为二进制数的应用程序
*题目:
编写一个把中缀表达式转换为后缀表达式(逆波兰式)的应用程序
*题目:
设计一个选择式菜单,以菜单方式选择上述操作。
*栈子系统
********************************
**1------进栈*
**2------出栈*
**3------显示*
**4------数值转换*
**5------逆波兰式*
**0------返回*
********************************
*请选择菜单号(0--5):
*/
#include<>
#include<>
#defineSTACKMAX50
typedefstructsta//栈的存储结构
{
intdata;
structsta*next;
}stackNode;
typedefstruct//指向栈顶的指针
{
stackNode*top;
}linkStack;
voidconversion(intn);
voidpush(linkStack*p,intx);
intpop(linkStack*p);
voidshowStack(linkStack*p);
voidsufflx();
/*************************************************
Function:
main()
Description:
主调函数
Calls:
push()
pop()
showStack()
conversion()
Input:
NULL
Return:
void
Others:
NULL
*************************************************/
voidmain()
{
intx,choice,i=1;
linkStackp;
=NULL;//置空栈
while(i)
{
printf("\n栈子系统\n");
printf("*******************************\n");
printf("*1------进栈*\n");
printf("*2------出栈*\n");
printf("*3------显示*\n");
printf("*4------数值转换*\n");
printf("*5------逆波兰式*\n");
printf("*0------返回*\n");
printf("*******************************\n");
printf("请选择菜单号(0--5):
");
fflush(stdin);//清空输入的缓存区
choice=getchar();
switch(choice)
{
case'1':
while
(1)
{
printf("请输入一个整数(‘0’表示结束)并按回车:
");
scanf("%d",&x);
if(x!
=0)
{
push(&p,x);//入栈
}
else
{
break;
}
}
break;
case'2':
x=pop(&p);//出栈
if(x>0)
{
printf("出栈元素为:
%d\n",x);
}
else
{
printf("栈为空,没有元素可以出栈!
\n");
}
break;
case'3':
showStack(&p);//显示栈元素
break;
case'4':
printf("请输入十进制数:
");
scanf("%d",&x);
conversion(x);//数值转换
break;
case'5':
sufflx();
break;
case'0':
i=0;
break;
default:
i=1;
break;
}
}
}
/*************************************************
Function:
conversion()
Description:
十进制数转换二进制数
Calls:
push()
pop()
Input:
n:
输入的要转换的数
Return:
void
Others:
NULL
*************************************************/
voidconversion(intn)
{
linkStacks;
intx,i=1;
=NULL;//置空栈
do
{
x=n%2;//求余数
n=n/2;//求新商
push(&s,x);//入栈
}while(n);
printf("转化的二进制为:
");
while(i)
{
x=pop(&s);//出栈
if(x!
=-1)//判断是否全部出栈
{
printf("%d",x);
}
else
{
i=0;
}
}
printf("\n");
}
voidsufflx()
{
charstr[STACKMAX];//存储中缀表达式
charexp[STACKMAX];//存储后缀表达式
charstark[STACKMAX];//顺序栈来存放运算符
inttop=0;//顺序栈置空
intsum,t,i=0;
charch;
printf("请输入一个算术表达式(运算符只能包含+,-,*,/),以#结束:
\n");
fflush(stdin);
do
{
i++;
scanf("%c",&str[i]);
}while(str[i]!
='#'&&i!
=STACKMAX);//存储用户输入的中缀表达式
sum=i;//保存表达式的长度
i=t=1;
ch=str[i];
i++;
while(ch!
='#')
{
switch(ch)
{
case'(':
//读取到‘(’时,入栈
top++;
stark[top]=ch;
break;
case')':
//读取到‘)’时
while(stark[top]!
='(')
{
exp[t++]=stark[top--];//出栈并赋值给输出数组
exp[t++]=',';//添加分割符号
}
top--;//栈顶元素为‘(’时,出栈
break;
case'+':
//读取到‘+’时
while(top!
=0&&stark[top]!
='(')//判断符号优先级
{
exp[t++]=stark[top--];
exp[t++]=',';
}
stark[++top]=ch;//栈为空时入栈
break;
case'-':
//读取到‘-’时
while(top!
=0&&stark[top]!
='(')
{
exp[t++]=stark[top--];
exp[t++]=',';
}
stark[++top]=ch;//栈为空时入栈
break;
case'*':
//读取到‘*’时
while(stark[top]=='*'||stark[top]=='/')//*、/运算级最高
{
exp[t++]=stark[top--];
exp[t++]=',';
}
stark[++top]=ch;//运算符优先级高的入栈
break;
case'/':
//读取到‘/’时
while(stark[top]=='*'||stark[top]=='/')
{
exp[t++]=stark[top--];
exp[t++]=',';
}
stark[++top]=ch;//运算符优先级高的入栈
break;
case'':
//读取到空格时忽略
break;
default:
//不是运算符号时
while(ch>='0'&&ch<='z')//限制输入的变量
{
exp[t++]=ch;
ch=str[i++];
}
i--;//上面多加的要去掉
exp[t++]=',';
break;
}
ch=str[i++];
}
while(top!
=0)//顺序栈中仍有数值时
{
exp[t++]=stark[top--];
if(top!
=0)
{
exp[t++]=',';
}
}
printf("中缀表达式为:
");//输出
for(i=1;i{
printf("%c",str[i]);
}
printf("\n后缀表达式为:
");
for(i=1;i{
printf("%c",exp[i]);
}
}
/*************************************************
Function:
push()
Description:
入栈
Calls:
NULL
Input:
*p:
栈的栈顶指针
x:
要入栈的数
Return:
void
Others:
NULL
*************************************************/
voidpush(linkStack*p,intx)//入栈
{
stackNode*q;
q=(stackNode*)malloc(sizeof(stackNode));
q->data=x;
q->next=p->top;
p->top=q;
}
/*************************************************
Function:
pop()
Description:
出栈
Calls:
NULL
Input:
*p:
栈的栈顶指针
Return:
int
Others:
NULL
*************************************************/
intpop(linkStack*p)//出栈
{
stackNode*q;
intx;
if(p->top!
=NULL)
{
q=p->top;
x=q->data;
p->top=q->next;
free(q);
returnx;//返回栈顶元素
}
else
{
return-1;
}
}
/*************************************************
Function:
showStack()
Description:
显示栈中元素
Calls:
NULL
Input:
*p:
栈的栈顶指针
Return:
void
Others:
NULL
*************************************************/
voidshowStack(linkStack*p)
{
stackNode*q;
q=p->top;
if(q!
=NULL)
{
printf("栈元素为:
");
while(q!
=NULL)
{
printf("%4d",q->data);
q=q->next;
}
printf("\n");
}
else
{
printf("栈为空。
\n");
return;
}
}