栈3--后缀表达式

栈3--后缀表达式

一、心得

代码的关键部分标红

二、题目及分析

后缀表达式

不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *

三、代码及结果

 1 #include <iostream>
 2 #include <stack>
 3 #include <string>
 4 using namespace std;
 5
 6 stack<double> sta;
 7
 8 int cal(string &s){
 9     for(int i=0;i<s.length();i++){
10         if(s[i]==‘+‘){
11             double b=sta.top();
12             sta.pop();
13             double a=sta.top();
14             sta.pop();
15             sta.push(a+b);
16             //cout<<a+b<<endl;
17         }
18         else if(s[i]==‘-‘){
19             double b=sta.top();
20             sta.pop();
21             double a=sta.top();
22             sta.pop();
23             sta.push(a-b);
24             //cout<<a-b<<endl;
25         }
26         else if(s[i]==‘*‘){
27             double b=sta.top();
28             sta.pop();
29             double a=sta.top();
30             sta.pop();
31             sta.push(a*b);
32             //cout<<a*b<<endl;
33         }
34         else if(s[i]==‘/‘){
35             double b=sta.top();
36             sta.pop();
37             double a=sta.top();
38             sta.pop();
39             sta.push(a/b);
40             //cout<<a/b<<endl;
41         }
42         else {
43             //主要是这一部分要看看
44             double x=0;
45             while(s[i]!=‘ ‘){
46                 x=x*10+s[i++]-‘0‘;
47             }
48             sta.push(x);
49             //cout<<x<<endl;
50         }
51     }
52     return sta.top();
53 }
54
55 int main(){
56     freopen("in.txt","r",stdin);
57     string s;
58     getline(cin,s);
59     cout<<cal(s)<<endl;
60     return 0;
61 } 

16 9 4 3 +*-

时间: 09-22

栈3--后缀表达式的相关文章

四则运算使用栈和后缀表达式

我们在一般的四则运算都是中缀表达式. 别问我什么是中缀表达式. 我就知道符号两边是数字.也就是符号在中间. 1+3 什么是后缀表达式呢? 13+ 符号在后面. 那么就有人奇怪了,为什么我要使用后缀表达式呢? 问题就是运算的时候,在编程实现的时候,后缀表达式比中缀表达式好用呗. 没事,不理解那里好用没事,我们先把中缀表达式转换成后缀表达式然后实际看看就知道了. 从左到右依次读取 运算数,输出 左括号,入栈 右括号,将栈顶的运算符并输出,直到遇到左括号 运算符 { 若优先级大于栈顶运算符,入栈 若优

栈应用 - 后缀表达式的计算

有关栈API详情參看我的还有一篇博文:栈的链式存储 - API实现 遍历后缀表达式中的数字和符号 对于数字:进栈 对于符号: 从栈中弹出右操作数 从栈中弹出左操作数 依据符号进行运算 将运算结果压入栈中 遍历结束:栈中的唯一数字为计算结果 #include <stdio.h> #include "LinkStack.h" int isNumber3(char c) { return ('0' <= c) && (c <= '9'); } int

c++实验4 栈及栈的应用+回文+中、后缀表达式

栈及栈的应用+回文+中.后缀表达式 1.栈顺序存储结构的基本操作算法实现 (1)栈顺序存储结构的类定义: class SeqStack { private: int maxsize; DataType *data; //顺序堆栈数组 int top; //栈顶位置指示器 public: SeqStack(int size); //构造函数 ~SeqStack(void) {} //析构函数 void Push(const DataType item); //入栈 DataType Pop(voi

zstu4189——后缀表达式——逻辑运算

Description 还记得大学里学过的模电么,今天就让我们将与或非变成一道题吧. 给你一个与或非的表达式,求出这个表达式的值,表达式总共有八种字符. 三种逻辑运算符按照优先级排列如下. ‘!’:表示取反. ‘&’:逻辑与. ‘|’:逻辑或. 两个字符‘T’,‘F‘分别表示true和 false. 另外还有左右括号,空格三种字符.跟一般的表达式一样,括号可以改变优先级. Input 每组数据输入一行字符串,字符串长度小于等于100. Output 输出一个数0或1,表示逻辑表达式的答案. Sa

数据结构 栈的应用 --表达式求值

一: 中缀表达式求值  思想: 需要2个栈,运算对象栈OPND,运算符栈OPTR, 1:将栈OPND初始化为空,栈OPTR初始化为表达式的定界符# 2:扫描表达式,直到遇到结束符# 2.1:当前字符是运算对象,入栈OPND 2.2:当前字符是运算符且优先级比栈OPTR的栈顶运算符优先级高,入栈OPTR,处理下一个字符 2.3:当前字符是运算符且优先级比栈OPTR的栈顶运算符优先级低,则从栈OPND出栈2个运算对象,从栈OPTR出栈一个运算符进行运算,并将运算结果入栈OPND,处理当前字符 2.4

利用栈计算算数表达式的值

先将中缀表达式利用栈转换为后缀表达式,然后再利用栈由后缀表达式计算算数表达式的值,具体代码如下: #include <iostream> using namespace std; #include <string> #include <vector> #include <stack> enum Type { OP_NUM, OP_SYMBOL, }; enum Operat { ADD, SUB, MUL, DIV, }; struct Cell { Typ

中缀表达式求后缀,再由后缀表达式求值

人:中缀表达式 计算机:后缀表达式 需要进行中缀转后缀,再计算.无论哪一步都需栈: 对于(3 + 4) × 5 - 6 一 中缀转后缀 涉及的栈用来存储符号如"+ - × / ( )" 思想: 遇见数字输出:遇见符号入栈 当空栈或者符号是左括号时直接入栈 ; 当是运算符时将要入栈的符号需要大于栈内符号否在现将栈内比该运算符大或者等的出栈输出,然后再入栈; 当运算符是右括号时,将栈内直到第一个左括号的符号出栈,并输出非括号的符号 算法: //中缀表达式改成后缀表达式 void mid2a

逆波兰表达式——中缀表达式转后缀表达式

逆波兰表达式 先说一下中缀表达式,平时我们使用的运算表达式就是中缀表达式,例如1+3*2,中缀表达式的特点就是:二元运算符总是置于与之相关的两个运算对象之间 人读起来比较好理解,但是计算机处理起来就很麻烦,运算顺序往往因表达式的内容而定,不具规律性 后缀表达式,后缀表达式的特点就是:每一运算符都置于其运算对象之后,以上面的中缀表达式1+2*3为例子,转为后缀表达式就是123*+ 下面先分析怎么把中缀表达式转换为后缀表达式,这里我们考虑六种操作符'+'.'-'.'*'.'/'.'('.')',完成

栈的应用 - 后缀表达式转中缀表达式

有关栈API详情请参看我的另一篇博文:栈的链式存储 - API实现 实例: 5 + 4=> 5 4 + 1 + 2 * 3 => 1 2 3 * + 8 + ( 3 – 1 ) * 5 => 8 3 1 – 5 * + 中缀表达式符合人类的阅读和思维习惯 后缀表达式符合计算机的"运算习惯" 中缀转后缀算法: 遍历中缀表达式中的数字和符号 对于数字:直接输出 对于符号: 左括号:进栈 运算符号:与栈顶符号进行优先级比较 若栈顶符号优先级低:此符合进栈 (默认栈顶若是左括

洛谷P1449——后缀表达式(栈模拟)

题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级). 如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.[email protected].'@'为表达式的结束符号.'.'为操作数的结束符号. 输入输出格式 输入格式: 输入:后缀表达式 输出格式: 输出:表达式的值 输入输出样例 输入样例#1: 3.5.2.-*[email protected] 输出样例#1: 1