数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000MS Memory limit: 65536K
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
解析: 其实对于栈的操作,大家更喜欢用stl,但是手写栈也是很重要的,可以让我们了解栈的内部操作;
对于这个题来说不用栈也行,用树的后序遍历更好。
讲一下核心内容:(1)、遇到字母一律输出;
(2)、遇到左括弧一律入栈;
(3)、遇到右括弧就把两个括弧之间的所有符号出栈输出,并且左括弧出栈;
(4)、遇到“+”或“-”,如果栈不空并且栈顶不是左括弧就出栈输出这一个栈顶,“+”或“-”入栈;
(5)、遇到“*”或“/”,如果栈不空并且栈顶不是左括弧并且栈顶是“*”或“/”,就把栈顶出栈输出,“*”或“/”入栈;
这是操作步骤,想问“+”、“-”、“*”、“/”为什么操作不一样,那就是符号优先级的问题了。
///***********代码
#include <stdio.h>
#include <stdlib.h>
#define maxstact 1000
typedef char elemstack;
typedef struct
{
elemstack *top;
elemstack *base;
int sizestack;
} Sq;
int initstack(Sq &L)
{
L.base=new elemstack[maxstact];
if(!L.base)
exit(0);
L.top=L.base;
L.sizestack=maxstact;
}
int push(Sq &L,char s)
{
if(L.top-L.base>L.sizestack)
return -1;
*(L.top++)=s;
return 0;
}
int pop(Sq &L)
{
if(L.top<=L.base)
return -1;
printf("%c",*(--L.top));
}
int main()
{
Sq L;
char a[1000],*s;
int i;
gets(a);
initstack(L);
for(i=0; a[i]!='#'; i++)
{
switch(a[i])
{
case '(':
push(L,a[i]);
break;
case ')':
{
while(L.top>L.base&&*(L.top-1)!='(')
pop(L);
L.top--;
break;
}
case '+':
{
if(L.top>L.base&&*(L.top-1)!='(')
pop(L);
push(L,a[i]);
break;
}
case '-':
{
if(L.top>L.base&&*(L.top-1)!='(')
pop(L);
push(L,a[i]);
break;
}
case '*':
{
if(L.top>L.base&&*(L.top-1)!='('&&(*(L.top-1)=='*'||*(L.top-1)=='/'))
pop(L);
push(L,a[i]);
break;
}
case '/':
{
if(L.top>L.base&&*(L.top-1)!='('&&(*(L.top-1)=='*'||*(L.top-1)=='/'))
pop(L);
push(L,a[i]);
break;
}
default:
{
printf("%c",a[i]);
break;
}
}
}
while(L.top>L.base)
{
pop(L);
}
return 0;
}