【问题描述】
从标准输入中读入一个整数算术运算表达式,如24 / ( 1 + 5%3 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 )= ,计算表达式结果,并输出。
要求:
1、表达式运算符只有+、-、*、/、%,表达式末尾的=字符表示表达式输入结束,表达式中可能会出现空格;
2、表达式中会出现圆括号,括号可能嵌套,不会出现错误的表达式;
3、出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1。
4、要求采用逆波兰表达式来实现表达式计算。
【输入形式】
从键盘输入一个以=结尾的整数算术运算表达式。操作符和操作数之间可以有空格分隔。
【输出形式】
在屏幕上输出计算结果(为整数,即在计算过程中除法为整除)。
【样例输入】
24 / ( 1 + 5%3 + 36 / 6 / 2 - 2) * ( 12 / 2 / 2 ) =
【样例输出】
18
【样例说明】
按照运算符及括号优先级依次计算表达式的值。
方法一
#include <stdio.h>
#include <string.h>
#define MAX 202
struct opstack
{
int data[101];
char character[101];
int top;
};
int i, j, n, result;
char c;
typedef struct opstack stack;
stack op, num;
void initstack(stack *s) {
s->top = -1; }
void push_stack(stack *s, char c, int line)
{
s->character[++s->top] = c;
s->data[s->top] = line;
}
int pop_stack(stack *s, stack *num)
{
int tamp = 0;
switch (s->character[s->top])
{
case '+':
tamp = num->data[num->top - 1] + num->data[num->top];
break;
case '-':
tamp = num->data[num->top - 1] - num->data[num->top];
break;
case '*':
tamp = num->data[num->top - 1] * num->data[num->top];
break;
case '/':
tamp = num->data[num->top - 1] / num->data[num->top];
break;
case '%':
tamp = num->data[num->top - 1] % num->data[num->top];
break;
}
s->character[s->top] = '\0';
s->data[s->top] = '\0';
s->top--;
num->top -= 2;
return tamp;
}
int main(void)
{
initstack(&op);
initstack(&num);
op.character[++op.top] = 32;
op.data[op.top] = -1;
while ((c = getchar()) != '=')
{
if (c >= '0' && c <= '9')
{
for (i = 0; c >= '0' && c <= '9'; c = getchar())
n = c - '0' + n * 10;
ungetc(c, stdin);
push_stack(&num, 32, n);
n = 0;
}
else if (c != ' ')
{
int pnum = 0, option = 0;
switch (c)
{
case '+':
option = 1;
break;
case '-':
option = 1;
break;
case '*':
option = 2;
break;
case '/':
option = 2;
break;
case '%':
option = 2;
break;
case '(':
option = 5;
break;
case ')':
option = 6;
break;
}
if (option <= op.data[op.top] && op.data[op.top] != 5)
{
pnum = pop_stack(&op, &num);
push_stack(&num, 32, pnum);
}