中缀试转后缀试及前缀试并计算其结果

  1 /*
  2         参考大神nb的代码,感觉思路不错!终于搞明白了!一开始不明白在计算表达式的时候,利用栈到底做了什么!现在感觉我们利用栈就是模拟我们书面上计算表达式,
  3        将优先级高的运算先计算出来,然后放进栈中,等待下一次的计算
  4 */
  5 #include<iostream>
  6 #include<string>
  7 #include<stack>
  8 #include<cstdio>
  9 using namespace std;
 10
 11 class node
 12 {
 13 public:
 14      double ret;
 15      string prefix, suffix;//前缀表达式和后缀表达式
 16      node()
 17      {
 18          ret=0;
 19          prefix=suffix="";
 20      }
 21 };
 22
 23 stack<node>optd;//操作数栈
 24 stack<char>optr;//操作符栈
 25
 26 char formula[1000];//表达式以"=" 结束
 27
 28 int cmp(char ch)//定义符号的优先级
 29 {
 30    switch(ch)
 31    {
 32       case ‘#‘: return -2;
 33       case ‘=‘: return -1;
 34       case ‘+‘:
 35       case ‘-‘: return 1;
 36       case ‘*‘:
 37       case ‘/‘: return 2;
 38       case ‘(‘: return 3;
 39       case ‘)‘: return 0;
 40    }
 41    return -2;
 42 }
 43
 44 double deal(double x, char ch, double y)
 45 {
 46    switch(ch)
 47    {
 48        case ‘+‘: return x+y;
 49        case ‘-‘: return x-y;
 50        case ‘*‘: return x*y;
 51        case ‘/‘: return x/y;
 52    }
 53    return 0.0;
 54 }
 55
 56 void cal()
 57 {
 58    int i=0, n;
 59    node num, aTmp, bTmp;
 60    while(optr.top()!=‘=‘)
 61    {
 62       if(formula[i]>=‘0‘ && formula[i]<=‘9‘)
 63       {
 64            sscanf(formula+i, "%lf%n", &num.ret, &n);
 65            num.prefix.assign(formula+i, n);
 66            num.suffix.assign(formula+i, n);
 67            i+=n;
 68            optd.push(num);
 69       }
 70       else
 71       {
 72            if(optr.top()==‘(‘ && formula[i]==‘)‘)//消除一对括弧
 73            {
 74          optr.pop();
 75          ++i;
 76          }
 77            if(cmp(formula[i]) > cmp(optr.top()) || optr.top()==‘(‘)//当前运算符大于栈顶运算符直接进栈
 78      {
 79          optr.push(formula[i]);
 80          ++i;
 81      }
 82      else
 83      {
 84         char ch=optr.top(), preTmp[]={ch, ‘ ‘, ‘\0‘}, sufTmp[]={‘ ‘, ch, ‘\0‘} ;
 85         optr.pop();//弹出一个栈顶操作符
 86         bTmp=optd.top(); optd.pop();//得到第二个操作数
 87         aTmp=optd.top(); optd.pop();//得到第一个操作数
 88         aTmp.ret=deal(aTmp.ret, ch, bTmp.ret);
 89
 90         aTmp.suffix+=" " + bTmp.suffix + sufTmp;//得到运算后的后缀式子
 91         aTmp.prefix=preTmp + aTmp.prefix + " " + bTmp.prefix;//得到运算前的后缀式子
 92         optd.push(aTmp);//不要忘记将计算的结果放入栈中
 93      }
 94       }
 95    }
 96    optr.pop();//别忘记弹出栈顶上的‘=‘
 97 }
 98
 99 int main()
100 {
101    optr.push(‘#‘);//初始化栈顶操作符是‘#’
102    while(cin>>formula)
103    {
104        cal();
105        node ans=optd.top(); optd.pop();
106        cout<<"表达式结果:"<<ans.ret<<endl<<"前缀试:"<<ans.prefix+‘=‘<<endl<<"后缀试:"<<ans.suffix+‘=‘<<endl;
107    }
108    return 0;
109 }

中缀试转后缀试及前缀试并计算其结果

时间: 2024-10-23 12:41:17

中缀试转后缀试及前缀试并计算其结果的相关文章

【转】前缀、中缀、后缀表达式

它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计

深入理解前缀、中缀、后缀表达式

1.我们首先来看一下,什么是前缀.中缀.后缀表达式: 中缀表达式: 2 - 3 * 4 后缀表达式:2 3 4 * - 前缀表达式:- 2 * 3 4 简单介绍下,前中后的划分依据为两个数字的操作符处于两个数字的前面,中间还是后面,其中中缀表达式为我们日常生活中常见的表达形式. 2.重要操作过程 后缀表达式求值过程: 从左到右扫描后缀表达式:遇到数字就将其压入栈中:遇到操作符,则取出栈顶的两个元素(栈顶元素为a, 另一个为b),并计算b 操作符 a的取值,并将结果重新压入栈中.扫描整个表达式结束

java四则运算----前缀、中缀、后缀表达式

接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现有点复杂,然后各种for,感觉非常不爽,于是问网上搜了下,发现一种叫波兰式的计算方法,瞬间茅塞顿开. http://blog.csdn.net/antineutrino/article/details/6763722 以下为原文引用 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.

前缀、中缀、后缀表达式及其求值

它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 比如: (4 + 5) × 6- 7 就是中缀表达式 - × + 4567 前缀表达式 45 + 6×7 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表

前缀、中缀、后缀表达式以及简单计算器的实现

前缀表达式(波兰表达式).中缀表达式.后缀表达式(逆波兰表达式) 介绍 三种表达式都是四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解. 前缀表达式 前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面.为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”.例如,- 1 + 2 3,它等价于1-(2+3). 中缀表达式 中缀表达式就是一般的算数表达式,操作符以中缀形式出现在操作数之间. 后缀表达式 后缀表达式指

算术表达式的前缀,中缀,后缀相互转换

原博客地址:https://blog.csdn.net/smartab/article/details/81215940 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值.对计算机来说,计算前缀或后缀表达式的值非常简单. 前缀表达式(前缀记法.波

【信息学奥赛一本通】第三部分_栈 ex1_4cale (中缀转后缀7符号)

其实这个中缀转后缀是费了很大功夫的,明白算法后第一次实现花了近三小时ORZ #include <stdio.h> #include <string.h> #include <ctype.h> char Mstr[511],Msta[511] = {'@'},Bstr[511]; int sta[511]; const short list[4][4] = {{0,-1,1,1},{1,0,1,1},{1,1,1,-2},{-1,-1,2,1}}; int level (

将中缀转换为后缀并求值

一.中缀转后缀 中缀转后缀口诀: 1.遇到操作数,直接输出. 2.当栈为空时,遇到操作符直接入栈. 3.遇到左括号,将其入栈 4.遇到右括号,执行出栈,输出出栈的元素,直到弹出左括号,(左右括号不输出). 5.遇到运算符时,依次弹出所有优先级大于或等于该运算符的栈顶元素(到输出)然后将该元素入栈,否则直接入栈. 6.最终栈顶元素依次输出. 中缀表达式“9+(3-1)*3+10/2”转化为后缀表达式“9 3 1-3*+ 10 2/+” 下面我们来具体看看这个过程. 1. 初始化一空栈,用来对符号进

[栈和队列]从中缀向后缀转换表达式

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define INIT_STACK_SIZE 100 5 typedef struct 6 { 7 char * chOperator; 8 int dwtop; 9 }OPND; 10 11 void InitStack(OPND *); 12 char Pop(OPND *); 13 void Push(OPND *,char );