基本步骤:
- 用键盘输入一个整数后缀表达式(操作数范围只有0到9, 运算符只有+、-、*、/,中间不能有空格),使用循环程序从左到右读入表达式
- 如果读入的是操作数,直接进入操作数栈
- 如果读入的是运算符,立即从操作数栈中取出所需的操作数,计算操作数运算的值,并将计算结果存回操作数栈
//9+(3-1)*3+10/2
#include<stdio.h>
#include<stdlib.h>
#define M 100
typedef struct//用于中缀表达式改为后缀表达式
{
char data[M];
int top;
}opstack;
typedef struct
{
float data[M];
int top;
}stack;//用于后缀表达式
void trans(char str[], char exp[])//用数组a储存原来的表达式,数组b储存处理后的数据
{
opstack op;//op为栈,用于存放运算符
char ch;
int i = 0, t = 0;
op.top = -1;//数组下标从0开始
ch = str[i];
i++;
while (ch != '\0')
{
switch (ch)
{
case'(':
op.top++;
op.data[op.top] = ch;//左括号入栈
break;
case')':
while (op.data[op.top] != '(')//当遇到右括号时,弹出所有的元素知道遇到左括号为止
{
exp[t] = op.data[op.top];//栈顶元素出栈,放到数组
op.top--;
t++;
}
op.top--;//左括号弹出,但不输出
break;
case'+':
case'-':
while (op.top != -1 && op.data[op.top] != '(')
{
exp[t] = op.data[op.top];
op.top--;//每次出栈元素少一个
t++;//数组里的元素增加
}
op.top++;
op.data[op.top] = ch;//储存该字符到栈里
break;
case'*':
case'/':
while (op.top == '/' || op.top == '*')
{
exp[t] = op.data[op.top];
op.top--;
t++;
}
op.top++;
op.data[op.top] = ch;
break;
case' ': //输入为空格,则跳过
break;
default:
while (ch >= '0' && ch <= '9')
{
exp[t] = ch;
t++;//数字元素直接存放到数组
ch = str[i];//更新ch字符的值
i++;//作为循环结束的条件
}
i--;//循环结束后会有一个元素未出处理到
exp[t] = ' ';
t++;
}
ch = str[i];
i++;
}
while (op.top != -1)
{
exp[t] = op.data[op.top];
t++;
op.top--;//保证所有元素都处理
}
exp[t] = '\0';//字符型数组的结束标志
}
float compvalue(char exp[]) //后缀表达式求值
{
stack st;//字符型数字处理成浮点型,存储到st数组里
float d;
char ch;
int t = 0;
st.top = -1;//当存入数据,数组下标就会变为零
ch = exp[t];
t++;
while (ch != '\0')
{
switch (ch)//所有的运算建立在数字字符已经转换完成
{
case'+':
st.data[st.top - 1] = st.data[st.top - 1] + st.data[st.top];//取出两个元素,运算后放如栈中
st.top--;//两个元素运算后剩下一个元素
break;
case'-':
st.data[st.top - 1] = st.data[st.top - 1] - st.data[st.top];
st.top--;
break;
case'*':
st.data[st.top - 1] = st.data[st.top - 1] * st.data[st.top];
st.top--;
break;
case'/':
if (st.data[st.top] != 0)
{
st.data[st.top - 1] = st.data[st.top - 1] / st.data[st.top];
st.top--;
}
else
printf("\n\t表达式中有除数为零,本次计算无效!\n");
break;
default:
d = 0;//处理中转箱
while (ch >= '0' && ch <= '9')
{
d = 10 * d + ch - '0';//通过ascii码的差值将字符型数字转为整型
ch = exp[t];//更新ch得知,作为循环结束的条件
t++;
}
st.top++;//top的初始值为-1,数据处理前都要+1
st.data[st.top] = d;
}
ch = exp[t];
t++;
}
return st.data[st.top];
}
int main()
{
char str[M], exps[M];
printf("\n请输入一个算术表达式:");
printf("\n提示:操作数范围的范围是“0-9”,运算符只含+,-,*,/和括号,之间不可以有空格\n");
gets_s(str);
printf("\n原算术表达式为:%s\n", str);
trans(str, exps);
printf("\n其后缀表达式为:%s\n", exps);
printf("\n其运算的结果为:%g\n\n", compvalue(exps));
}
代码呈现如下——