栈的典型实例问题——后缀表达式(逆波兰记号)的计算

//编译程序一般使用后缀表达式求解表达式的值(RPN或者逆波兰记号)
//计算后缀表达式的过程为:扫描,如果该项是操作数,压栈;如果是操作符,则从栈中退出两个操作数(先退出的是右操作
//数),进行运算,并将运算结果重新压入栈中,扫描完后栈顶存放的就是计算结果。
//注意的地方:是否支持2位以上的操作数!
//操作数之间也肯定是有分割符的;
//比如:12 34 56 * +
//如果是123456*+,不管是人还是计算机,都是没法做的;

 1 #include<iostream>
 2 #include<stack>
 3 #include<stdlib.h>//atoi()函数
 4 using namespace std;
 5 int main(){//能计算99位操作数,且输入的各项要有分隔符 eg:1 2 + 3 4 - * #
 6     char s[100];//操作数或者操作符
 7     stack<int>z;//操作数栈
 8     int a,b;//操作数
 9     while(cin>>s&&s[0]!=‘#‘){
10 //    while(cin>>s&&s!="#"){//不能用,想一想为什么!!!
11         if(s[0]==‘+‘){//加法,s[0]用的很妙!同理不能用s=="+",想一想为什么!!!
12             b=z.top();
13             z.pop();
14             a=z.top();
15             z.pop();
16             z.push(a+b);
17         }
18         else if(s[0]==‘-‘){//减法
19             b=z.top();
20             z.pop();
21             a=z.top();
22             z.pop();
23             z.push(a-b);
24         }
25         else if(s[0]==‘*‘){//乘法
26             b=z.top();
27             z.pop();
28             a=z.top();
29             z.pop();
30             z.push(a*b);
31         }
32         else if(s[0]==‘/‘){//除法
33            b=z.top();
34            z.pop();
35            a=z.top();
36            z.pop();
37            z.push(a/b);
38         }
39         else z.push(atoi(s));//操作数
40     }
41     cout<<z.top();//扫描完后栈顶存放的就是计算结果
42     return 0;
43 } 

原文地址:https://www.cnblogs.com/TYXmax/p/10987940.html

时间: 2024-07-30 11:45:56

栈的典型实例问题——后缀表达式(逆波兰记号)的计算的相关文章

JavaScript实现计算后缀表达式(逆波兰表达式)以及将中缀表达式转为后缀表达式

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的表达式 逆波兰表达式 a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)d ---> a,d,b,c,-,,+ a=1+3 ---> a=1,3 + http=(smtp+http+telnet)/1024 写成什么呢? http=smtp,http,telnet,+,+,1

栈的应用之中缀表达式转化为后缀表达式(逆波兰表达式)

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define OK 1 5 #define ERROR 0 6 #define STACK_INIT_SIZE 20 7 #define STACK_INCREMENT 10 8 9 typedef char Elemtype; 10 typedef int Status; 11 12 typedef struct StackNode{ 13 Elemtype* base; 14 Elemt

【栈】洛谷P1449 后缀表达式

#include <iostream> #include <stack> using namespace std; int main(){ stack<int>s; char t; while(cin>>t && t != '@'){ //输入字符串t 当为@时结束 if( t>='0' && t<='9'){ //如果t是数字 int a = t - '0'; //那么先把t赋值给a while(cin>&

Java解析字符串表达式--逆波兰表达式的计算

问题来由: 读入一个字符串形式的四则运算表达式,输出对应的计算结果.如读入的是"6 * ( 5 + ( 2 + 3) * 8 + 3)",那么解析后的输出结果应为288. 思路: 一般的计算过程是这样的,首先计算优先级最高的小括号里面的内容,即"( 5 + ( 2 + 3) * 8 + 3)", 将"2 + 3"的计算结果并存为A,接着用计算"A*8",并存为B 计算"5+B+3",结果存为C 最后计算&q

Java解析字符串表达式--逆波兰表达式的生成

上回讲了如何计算后缀表达式,其实真正的难点在于如何将一个正常的字符串表达式(中缀表达式)变成一个后缀表达式.如将6 * ( 5 + ( 2 + 3) * 8 + 3)变为6 5 2 3 + 8 * + 3 + * 逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的中缀表示 逆波兰表达式 a+b a,b,+ a+(b-c) a,b,c,-,+ a+(b-c)*d a,b,c,-,

栈的典型实例问题——括号匹配

1 //每一个右括号将与最近遇到的那个未匹配的左括号相匹配!!! 2 #include<iostream> 3 #include<stack> 4 #include<string.h> 5 using namespace std; 6 const int maxLength=100;//最大字符串长度 7 void PrintMatchedPairs(char*expression){ 8 stack<int> s; 9 int length=strlen(

中缀表达式转换成后缀表达式

中缀表达式即普通的运算式子,运算符是以中缀形式处于操作数的中间(例:3 + 4),后缀表达式就是逆波兰式(例:3 4 +),中缀表达式转后缀表达式也是学习数据结构中的栈的时候一个典型的例子,结合上一次写到逆波兰式.可以用这种原理即输入普通式子(即中缀表达式),转换成后缀表达式,然后通过后缀表达式(逆波兰式)的计算,可以得出结果. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define STACK_INIT_SIZE 20 4 #de

中缀表达式转后缀表达式---栈--二叉树---四则运算

我们平常书写的四则运算表达式属于中缀表达式,形式为"9+(3-1)*3+10/2",因为所有的运算符号都在两操作数之间,所以称为中缀表达式.我们使用中缀表达式来计算表达式的值,不过这种形式并不适合计算机求解.接下来,我们将中缀表达式转化为后缀表达式,所谓的后缀表达式就是操作符位于操作数后面的不包含括号的算数表达式,也叫做逆波兰表达式. 1)首先介绍一种人工的转化方法(http://www.cnblogs.com/MichaelYin/archive/2012/05/02/2479248

栈应用——逆波兰式表达式的值

问题描述: 计算给定的逆波兰表达式(即后缀表达式)的值. 事实上,二元运算的前提下,中缀表达式可以对应一棵二叉树:逆波兰式即该二叉树后序遍历的结果. 分析思路: 如果当前是操作数,则直接入栈: 如果当前是操作符,则栈顶的两个元素弹出,然后与当前操作符运算后入栈. Code: /** * 给出一个逆波兰式,计算该表达式的值 * @param s * @return */ public int getTheValueOfRPN(String s) { char[] ch = s.toCharArra