如何使用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问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
转换逆波兰求值(C语言)
转换逆波兰求值(C语言),经典动能强大,可用于小数的计算,用堆栈实现
C语言编写的加减乘除运算
C语言编写的加减乘除运算
c语言 多项式运算 加减乘除
编程 c语言 多项式运算 加减乘除 c语言 多项式运算 加减乘除
c语言设计简单计算器实现加减乘除运算
      编写程序的目的就是使程序有他应用的地方,编写一个简单的计算器来实现我们计算的目的。           利用swich  case 语句和循环结构来实现简单程序的编写。利用选择语句来进行输入的选择,然后利用所输入的数字的不同进行不同类型的运算,然后当需要退出时,则通过break语句跳出循环,实现一个程序的全部运行。        在这个计算器中,主要部分是构建分支语句的函数,使每一...
表达式求值,加减乘除混合运算
利用栈对一个表达式进行分析然后运算,能进行加减乘除四则混合运算,包括括号
逆波兰计算器--C语言实现
一个用栈实现的逆波兰算法,输入逆波兰表达式,可以算出值
使用位操作实现加减乘除运算
前言 在实际应用中一定要注意边界问题,包括上边界和下边界 注意: 位操作中常用的公式 a=n&(n-1);//去掉n中最右边的1; b=n&(-n);//得到n中最右边的1 -n==~n+1; -n==~(n-1); 代码: /*在正式应用中一定要注意边界问题,包括上边界和下边界*/ #include #include using namespace std; int add(int
不用“加减乘除”实现“加减乘除运算”
换了n种方法,终于是跑通了一个不超时的,记录一下 class Solution { public int divide(int dividend, int divisor) { boolean isMinus = ((dividend0 && divisor >0) || (dividend>0 && divisor 0)); //异号为true,同号为false
用C语言实现的逆波兰算法混合运算
一个用从语言来实现的算法实例,模拟计算机的混合运算机制
C语言 计算器程序 支持 加减乘除()^运算
C语言 计算器程序 支持 加减乘除()^运算(收集) (没有图形界面)
C语言大整数运算库加减乘除余
BigInt大整数运算库 前言 这个版本为第一个版本,未有太多优化。大多采用类似手算的算法 这个算法内存占用过大。自定义的结构体数字表示采用定长的方法,后期将优化采用动态长度的方法,减少内存占用。 Bint.h头文件具体解析 数据结构表示 数字的存储是以十进制为基础的,所以把一个char的大小定义为一个十进制存储bitDec。 而一个数字的表示采用基于bitDec的数组...
c语言:表达式求值实现(包含加减乘除括号)
这道题不难,但是当你认真去编代码的时候,还是要考虑好多细节,所以不能只停留在看懂的层面上,不去实践你永远不知道你到底掌握了没有,加油!   之前的表达式求值不包括括号运算,现将改进后的代码和源代码粘在上面,便于以后的复习。 一.不包括括号运算 #include #include #include #include #include #define STACK_INIT_S
表达式求值包含括号加减乘除的运算
表达式求值包含括号加减乘除的运算计算出表达式结果
数学表达式的求值算法实现(加减乘除及平方的混合运算)
用C++编写的实现加减乘乘及平方的混合运算的数学表达式求值源代码
表达式求值 整数的加减乘除带括号运算
最近闲着无聊在看表达式求值,自己做了一个整数 加减乘除的小程序代码如下:#include&amp;lt;iostream&amp;gt; #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cstring&amp;gt; #include&amp;lt;stack&amp;gt; #include&amp;lt;algorithm&amp;gt; #include&amp;lt;cmath&amp;gt; using namespace std; i...
C 语言 逆波兰计算机
为什么不管我怎么输入都是提示错误啊 是程序错了么? rnrn#include rn #include /* for atof() */rnrn #define MAXOP 100 /* max size of operand or operator */rn #define NUMBER '0' /* signal that a number was found */rnrn int getop(char []);rn void push(double);rn double pop(void);rnrn /* reverse Polish calculator */rn main()rn rn int type;rn double op2;rn char s[MAXOP];rnrn while ((type = getop(s)) != EOF) rn switch (type) rn case NUMBER:rn push(atof(s));rn break;rn case '+':rn push(pop() + pop());rn break;rn case '*':rn push(pop() * pop());rn break;rn case '-':rn op2 = pop();rn push(pop() - op2);rn break;rn case '/':rn op2 = pop();rn if (op2 != 0.0)rn push(pop() / op2);rn elsern printf("error: zero divisor\n");rn break;rn case '\n':rn printf("\t%.8g\n", pop());rn break;rn default:rn printf("error: unknown command %s\n", s);rn break;rn rn rn return 0;rn rnrnrnrn #define MAXVAL 100 /* maximum depth of val stack */rnrn int sp = 0; /* next free stack position */rn double val[MAXVAL]; /* value stack */rnrn /* push: push f onto value stack */rn void push(double f)rn rn if (sp < MAXVAL)rn val[sp++] = f;rn elsern printf("error: stack full, can't push %g\n", f);rn rnrn /* pop: pop and return top value from stack */rn double pop(void)rn rn if (sp > 0)rn return val[--sp];rn else rn printf("error: stack empty\n");rn return 0.0;rn rn rnrnrnrnrn #include rnrn int getch(void);rn void ungetch(int);rnrn /* getop: get next character or numeric operand */rn int getop(char s[])rn rn int i, c;rnrn while ((s[0] = c = getch()) == ' ' || c == '\t')rn ;rn s[1] = '\0';rn if (!isdigit(c) && c != '.')rn return c; /* not a number */rn i = 0;rn if (isdigit(c)) /* collect integer part */rn while (isdigit(s[++i] = c = getch()))rn ;rn if (c == '.') /* collect fraction part */rn while (isdigit(s[++i] = c = getch()))rn ;rn s[i] = '\0';rn if (c != EOF)rn ungetch(c);rn return NUMBER;rn rnrnrnrn
C语言的逆波兰
用C语言描述逆波兰式,先随机4个数字,然后用户任意加减乘除,看最后是不是24点
Verilog实现加减乘除运算
用Verilog实现,两个16位输入,一个32位输出的四则运算模块,这里我是使用的调用IP核的方式,毕竟人家官方推出的要比我们自个写的要稳定一点,这里调用了加法器,减法器,乘法器,触发器的IP核。 代码如下: module jisuan(     //input pin;     Clk,     Rst_n,     data_A,     data_B,     mode, //+,-,*...
html+js实现加减乘除运算
html+js实现加减乘除运算, blog: http://blog.csdn.net/zhulei632/article/details/23596299
VS实现加减乘除运算
VS2010实现简单的加减乘除运算,希望对初学者有益,大家共同学习。
实现简单的加减乘除运算
用c++编写一个程序,可以简单的计算加减乘除,不包含括号
实现加减乘除计算器。(c语言)
#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #include &quot;main.h&quot; int main() { int a=0; int b=0; char m; int result=0; printf(&quot;请输入数字:\r\n&quot;); scanf(&quot;%d&quot;,&amp;amp;a); getchar(); printf(&quot;请输入运算符:.
简单C语言计算器 只实现加减乘除运算
本程序对于初学C语言的同学很有帮助,#include "iostream" using namespace std; int main( void ) { double numbera, numberb, result; char operate; try { //输入操作数和运算符 cout<<"请输入第一个操作数:"; cin>>numbera; cout<<"请输入运算符:"; cin>>operate; cout<<"请输入第二个操作数:"; cin>>numberb; //计算结果 switch(operate) { case '+': result = numbera + numberb ; break;
C语言:模拟实现一个计算器(可以完成加减乘除运算)
使用switch…case…语句实现 #define _CRT_SECURE_NO_DEPRECATE 1 #include &amp;amp;lt;stdio.h&amp;amp;gt; #include &amp;amp;lt;stdlib.h&amp;amp;gt; int add(int x, int y) { return x + y; } int sub(int x, int y) { return x - y; } int ...
C语言实现 表达式求值
已经写了好久的东西,功能挺简单的,就是根据输入的表达式求值,没有开根号那些复杂的运算,主要还是练算法的
c语言实现的表达式求值
输入(2+4)*3/2 输出9 输入(2+1)*(4+1) 输出15
c语言实现表达式求值
用堆栈实现表达式的求值
表达式求值实现c语言
#include&amp;lt;bits/stdc++.h&amp;gt; #define STACK_INIT_SIZE 100 using namespace std; typedef struct { char date[STACK_INIT_SIZE]; int top; }OptrStack; typedef struct { double date[STACK_INIT_SI...
Java实现的表达式求值算法(包括加减乘除以及括号运算)
package com.begoina.zero; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * ...
表达式求值 栈实现 c++ 支持加减乘除运算
根据数据结构书编写,编译成功。例如:9/(1+2)# 输出结果为:3;输入9/(1+3)#输出结果为2.25 最后的结束符为#,下载的朋友可以在输入的方式上稍作改变,就可以做无限制的数值运算了。
表达式求值C语言实现
采用对文件的操作。和很多表达式求值的程序相比本程序最大特点是成功地解决了对float型和乘方的运算。
C语言实现表达式求值
[问题描述] 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 [基本要求] (1) 从键盘读入一个合法的算术表达式,输出正确的结果。 (2) 显示输入序列和栈的变化过程。 [选作内容] (1) 扩充运算符集合。 (2) 引入变量操作数。 (3) 操作数类型扩充到实数。
逆波兰表达式求值(C语言实现)
实验项目: 从文本文件输入任意一个语法正确的(中缀)表达式,显示并保存该表达式。 利用栈结构,把上述(中缀)表达式转换成后缀表达式,并显示栈的状态变化过程和所得到的后缀表达式。 利用栈结构,对上述后缀表达式进行求值,并显示栈的状态变化过程和最终结果。 备注:读文件的输入为(以'#'起始和结尾): #10+13*10+5%2+2^3+(5+6)*7# #include &amp;lt;stdio...
C语言实现算术表达式求值
话不多数代码如下,看不懂的同学请评论区留言哦 #include&lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; #define PLUS 0 #define MINUS 1 #define POWER 2 #define DIVIDE 3 #define LEFTP 4 #define RIGHP 5 #def...
C语言栈实现逆波兰计算器
逆波兰计算器: 输入所要计算的表达式的逆波兰式,并进行计算。 如   (1-2)*(4+5) 其逆波兰式:1  2  -  4  5  +  * 基础的东西,还是要多敲 如下代码中,输入的格式如:1  2  -  4  5  +  *  # #include #include #include #define Stack_Init_Size 20 #define Sta
不用加减乘除怎么实现加减乘除四个运算
程序中不能用+,-,*,/rn怎么实现加减乘除四个运算。rn比如add(3,5)=8rnsub(5,3)=2rn如何不用到+,-,*,/ 实现这些函数
表达式求值(逆波兰算法,javascript实现)
表达式求值(逆波兰算法,javascript实现)
基于vs2013 c语言实现逆波兰计算器
基于vs2013 c语言实现逆波兰计算器,能处理简单的加减乘除和三角函数等,并可以在框架的基础上扩展。同时具备变量处理能力。
C++语言使用字符数组实现大数加减乘除运算
要计算1000的阶乘,刚一听以为超级简单的递归,再一想发现不对,这个普通实现肯定会溢出,最后想到了可以用字符串实现这种大数的运算。 然后就直接写代码实现,还真不是那么容易,实现了加法和乘法,最后用乘法实现1000的递归,我去这么大的数,足足占了2000多位。 搞完了突然想何不封装个类,再就把减法和除法实现了,说做就做,由于有别的事情,除法就简单的用减法搞了,唉
使用BigDecimal实现精确加减乘除运算
商业计算不要使用浮点数在前几期的每日一练题目中,有一道题目是,需要精确计算的时候一定要使用BigDecimal。在本科时候其实计算机原理就曾经学过计算机的浮点数表示,但是从小数学的惯性思维上,总觉得乘法就移一下小数点,不会出问题。在商业计算中遇到带小数点的“元”转换为“分”的时候,进行*100的操作总觉得double根本不会出问题,于是怒踩了一坑。简单理解为什么会有精度问题大家都知道计算机要用二进...
相关热词 c# login 居中 c# 考试软件 c# 自然语言分析 c# 分段读取文件 c# 泛型反射 c#打断点 c# 时间转多少秒 c# 线程函数加参数 c# modbus 读取 c#查询集合表