数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
提示
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
int yxj(char c)//把输入的运算符转换成数字来比较优先级
{
if(c == '+'||c == '-') return 1;
if(c == '*'||c =='/') return 2;
if(c == '(') return 3;
if(c == ')') return 4;
return 0;
}
int main()
{
int top = 0;
char c = 0, stack[100];
while(scanf("%c", &c), c!='#')
{
if(c >= 'a'&&c <= 'z')//判断字符是不是运算符 不是就输出
{
printf("%c", c);
}
else
{
if(top == 0)//判断b栈是不是为空 是就直接入栈
{
top++;//栈顶向上移一位
stack[top] = c;//增加一个成员
}
else if(yxj(c) >= yxj(stack[top]))//如果是运算符 而且输入的比栈顶运算符优先级高
{
if(yxj(c) == 4)//如果是')'就把'('之前的运算符全部输出
{
while(stack[top] != '(')
{
printf("%c", stack[top--]);
}
top--;
}
else
{
top++;//如果不是 就入栈
stack[top] = c;
}
}
else//如果优先级比它低
{
if(stack[top] != '(')//如果不是'(' 就把它(优先级高)出栈
{
printf("%c", stack[top]);
stack[top] = c;
}
else
{
top++;
stack[top] = c;//如果是'(' 就直接入栈
}
}
}
}
while(top != 0)//判断栈是否为空 不为空就全部出栈
{
printf("%c", stack[top]);
top--;
}
printf("\n") ;
return 0 ;
}
</pre><pre name="code" class="cpp">
</pre><pre name="code" class="cpp"><pre name="code" class="cpp">#include <stdio.h>
#include <string.h>
int cmp(char a)
{
if(a == '-' || a == '+') return 1;
if(a == '*' || a == '/') return 2;
if(a == ')') return 3;
if(a == '(') return 4;
return 0;
}
int main()
{
char a[1000], ls[1000];
while(~scanf("%s", a))
{
int t = 0, i = 0;
for(i = 0; a[i] != '#'; i++)
{
if(a[i] >= 'a' && a[i] <= 'z')
printf("%c", a[i]);
else
{
if(t == 0)
{
ls[t] = a[i];
t++;
}
else
{
if(cmp(ls[t-1]) >= cmp(a[i]))
{
if(ls[t-1] != '(')
{
printf("%c", ls[t-1]);
ls[t-1] = a[i];
}
else
{
ls[t++] = a[i];
}
}
else
{
if(a[i] == ')')
{
int n = t- 1;
for( ; ls[n] != '('; n--)
{
printf("%c", ls[n]);
}
t = n;
}
else
{
ls[t++] = a[i];
}
}
}
}
}
while(t--)
{
printf("%c", ls[t]);
}
printf("\n");
}
return 0;
}
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
int cmp(char a)
{
if(a == '-' || a == '+') return 1;
if(a == '*' || a == '/') return 2;
if(a == ')') return 3;
if(a == '(') return 4;
return 0;
}
typedef struct
{
char * base;
char *top;
}SqStack;
char a[1000];
void InitStack(SqStack &S)
{
S.base = (char *)malloc(1000*sizeof(char));
S.top = S.base;
}
void Push(SqStack &S, char e)
{
*S.top++ = e;
}
void Pop(SqStack &S)
{
char e;
e = *--S.top;
cout << e;
}
int main()
{
while(~scanf("%s", a))
{
int i;
SqStack S;
InitStack(S);
for(i = 0; a[i]!='#'; i++)
{
if(a[i] >= 'a' && a[i] <= 'z')
cout << a[i];
else
{
if(S.base == S.top)
{
Push(S, a[i]);
}
else
{
if(cmp(*(S.top-1)) >= cmp(a[i]))
{
if(*(S.top-1) != '(')
{
Pop(S);
Push(S, a[i]);
}
else
{
Push(S, a[i]);
}
}
else
{
if(a[i] == ')')
{
while(*(S.top-1) != '(')
{
Pop(S);
}
S.top--;
}
else
{
Push(S, a[i]);
}
}
}
}
}
while(S.top != S.base)
{
Pop(S);
}
cout << endl;
}
return 0;
}