逆波兰表示法

逆波兰表示发是一种将运算符写在操作数后面的描述程序(算式)的方法。举个例子,我们平常用中缀表示法描述的算式(1 + 2) * (5 + 4),改为逆波兰表示法之后则是1 2 + 5 4 + *。相较于中缀表示法,逆波兰表示法的优势在于不需要括号。

请输出以逆波兰表示法输入的算式的计算结果。

输入   在1行中输入1个算式。相邻的符号(操作数或运算符)用1个空格隔开。

输出   在1行之中输出计算结果。

限制   2≤算式中操作数的总数≤100

1≤算式中运算符的总数≤99

运算符仅包括“+”  “-”  “*”,操作数为106以下的正整数。

-1×109≤计算过程中的值≤109

 输入示例   

1 2 + 3 4 - *

输出示例

-3

参考代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 int top, S[1000];
 5
 6 void push(int x) {
 7     S[++top] = x;
 8 }
 9
10 int pop() {
11     top--;
12     return S[top + 1];
13 }
14
15 int main() {
16     int a, b;
17     top = 0;
18     char s[100];
19     while (scanf("%s", s) != EOF) {
20         if (s[0] == ‘+‘) {
21             a = pop();
22             b = pop();
23             push(a + b);
24         }
25         else if (s[0] == ‘-‘) {
26             a = pop();
27             b = pop();
28             push(a - b);
29         }
30         else if(s[0] == ‘*‘){
31             a = pop();
32             b = pop();
33             push(a * b);
34         }
35         else {
36             push(atoi(s));
37         }
38     }
39     printf("%d\n", pop());
40
41     return 0;
42 }

 

时间: 2024-10-08 13:38:01

逆波兰表示法的相关文章

leetcode-计算逆波兰表示法的值

package edu.bupt.cici.leetcode; import java.util.ArrayList; public class EvaluateReversePolishNotation { public int evalRPN(String[] tokens) { int temp = 0; int length = tokens.length; ArrayList<Integer> stack = new ArrayList<Integer>(); for (

栈的应用----四则运算,后缀逆波兰表示法(RPN)

我们从小就学习四则运算--加减乘除四则.我们也知道,要先乘除后加减,遇到括号要先算括号内的.可是,想让计算机进行这样的四则运算可不容易,它可不知道什么乘除优先,然后加减.那么,该如何让计算机也能进行这样的四则运算呢?就是通过栈. 我们人类非常熟悉也非常喜欢用中缀表示法进行算数运算,什么是中缀表示法呢?也就是,一个运算符在两个数字中间.比如,5+3,3*5,5/2等等,这些都是中缀表示法.这种表示法很适合人类使用,但是却不适用于计算机,于是,我们就想出了一种适合计算机的表示方式,叫做,后缀表示法,

逆波兰法(计算器)程序&lt;无符号版&gt;

涉及队列.栈的运用. Java中队列可以用: Queue<String> q = new LinkedList(); 来声明,其主要的方法有: poll(),peak(),offer(),clear(),size()等. Java中栈可以用: Stack s = new Stack(); 来声明,其主要方法有:push(),peak(),pop(),clear(),size()等. 1 package preTest; 2 3 import java.util.LinkedList; 4 im

逆波兰法求解数学表达示(C++)

主要是栈的应用,里面有两个函数deleteSpace(),stringToDouble()在我另一篇博客当中:对string的一些扩展函数. 本程序只是基本的功能实现,没有差错控制. #include<iostream> #include<stack> #include<string> #include<map> #include"fstring.h" /* *采用逆波兰表示法求解数学表达示 *1.将输入的中缀表示示转换成后缀表达示 *2

逆波兰表达式

1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用prin

中缀输入逆波兰计算器程序part1

在看K&R的时候,里面提到了逆波兰表示法,老实说看得我迷迷糊糊的,主要是这种反人类的后缀表示法做出的计算器,一般人根本就不知道怎么输入好吧.今天看书的时候,看到了将中缀表达式转为后缀表达式的方法才恍然大悟,原来是少了这一步.这下我就知道该如何做一个可用的逆波兰计算器了. 先简单介绍一下如何完成这步转换吧.中缀表达式就是我们习惯的表达式,比如:1+2*3 考虑运算符优先级的话后缀表达式则应该写成123*+ 写成后缀表达式的形式后我们可以利用栈轻松地解决计算问题,思路是当见到一个数时就把它推入栈:在

lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"]

逆波兰表达式(栈,递归)

1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用pr

noi1696 逆波兰表达式

1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间