3-7 表达式转换 (20 分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
结尾无空行
输出样例:
2 3 7 4 - * + 8 4 / +
这道题首先一个总的思路就是先创建一个栈用来存运算符,然后从左向右获取中缀表达式,如果是数字的话直接输出,是运算符的话就分以下几种情况
(1)左括号,直接进栈
(2)右括号,先出栈,判断是不是左括号,是的话就下一次循环,不是的话就依次出栈直到遇到左括号
(3)乘除,注意的是乘除虽然优先级是最高的,但是因为它的运算顺序是从左到右的,所以乘除遇到乘除仍然要先打出,不是乘除的话直接入栈就好
(4)加减,如果栈空的话直接入栈,否则将栈中优先级高的运算符依次弹出输出,直到栈空或碰到左括号
(5)字符串获取完后,将栈中剩余的运算符号依次弹出
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXSIZE 20
typedef char datatype;
typedef struct
{
datatype data[MAXSIZE];
int top;
}SeqStack;
SeqStack *InitStack();
SeqStack *InitStack()
{
SeqStack *s;
s=(SeqStack *)malloc(sizeof(SeqStack));
s->top=-1;
return s;
}
int Empty_SeqStack(SeqStack *s);
int Empty_SeqStack(SeqStack *s)
{
if(s->top==-1)
return 1;
else return 0;
}
int Push_SeqStack(SeqStack*s,datatype x);
int Push_SeqStack(SeqStack*s,datatype x)
{
if(s->top==MAXSIZE-1)
return 0;
else
{
s->top++;
s->data[s->top]=x;
return 1;
}
}
datatype PopStack(SeqStack *s);
datatype PopStack(SeqStack *s)
{
datatype x;
if(Empty_SeqStack(s))
return 0;
else
{
x