如何使用C语言实现逆波兰运算(加减乘除)求值?

《C语言程序设计现代方法(第2版)》第十章 程序结构 编程题6

有些计算器(尤其是惠普的计算器)使用逆波兰表示法(Revers Polish Notation, RPN)来书写数学表达式。在这一表示法中,运算符放置在操作数的后面而不是操作数中间。例如,在逆波兰表示法中1+2将表示为12+,而1+2×3将表示为123×+。逆波兰表达式可以很方便地用栈求值。算法从左向右读取运算符和操作数,并执行下列步骤。
1. 当遇到操作数时,将其压入栈中。
2. 当遇到操作符时,从栈中弹出它的操作数,执行运算并把结果压入栈中。

编写程序対逆波兰表达式求值,操作数都是个位的整数,运算符为+、-、*、/和=。遇到运算符=时,将显示栈顶项,随后清空栈并提示用户计算新的表达式。这一过程持续进行,直到用户输入一个既不是运算符也不是操作数的字符为止:

Enter an RPN expression: 1 2 3 * + =

Value of expression: 7

Enter an RPN expression: 5 8 * 4 9 - / =

Value of expression: -8

Enter an RPN expression: q

如果栈出现上溢,程序将显示消息Expression is too complex并终止。如果栈出现下溢(例如遇到表达式1 2 + +),程序将显示消息Not enough operands in expression并终止。提示:把10.2节的栈代码整合到你的程序中。使用scanf("%c", &ch)读取运算符和操作数。

10.2栈代码:

#include<stdbool.h>
#define STACK_SIZE 100

int top = 0;
int contents[STACK_SIZE];

void make_empty(void)
{
    top = 0;
}

bool is_empty(void)
{
    return top == 0;
}

bool is_full(void)
{
    return top == STACK_SIZE;
}

void push(int i)
{
    if (is_full())
        stack_overflow();
    else
        contents[top++] = i;
}

int pop(void)
{
    if (is_empty())
        stack_underflow();
    else
        return contents[--top];
}

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐