中缀表达式求值模板

#include <bits/stdc++.h>
using namespace std;

/*判断符号间的优先关系函数
*1表示>,0表示=,-1表示<
*c1栈内的算符,c2栈外的算符
*/
int Judge(char c1,char c2)
{
int a1,a2;
if(‘+‘==c1||‘-‘==c1) a1 = 3;
if(‘*‘==c1||‘/‘==c1)a1 = 5;
if(‘(‘==c1) a1 = 1;
if(‘)‘==c1) a1 = 7;
if(‘#‘==c1) a1 = 0;

if(‘+‘==c2||‘-‘==c2)a2 = 2;
if(‘*‘==c2||‘/‘==c2)a2 = 4;
if(‘(‘==c2) a2 = 6;
if(‘)‘==c2) a2 = 1;
if(‘#‘==c2) a2 = 0;
if(a1>a2) return 1;
if(a1==a2) return 0;
if(a1<a2) return -1;
}
//符号运算函数
double run(char c ,double d1,double d2)
{
switch (c)
{
case ‘+‘:
return d1+d2;
break;
case ‘-‘:
return d1-d2;
break;
case‘*‘ :
return d1*d2;
break;
case ‘/‘:
return d1/d2;
break;
default:
return 0.0;
break;
}
}
int main()
{
char * op = "+-*/()#";
string str ;
cin>>str;
//给表达式字符串str添加‘#‘结束标识符
str.append(1,‘#‘);
stack<char> OPTR;//运算符栈
stack<double> OPND;//操作数栈
int a = -1;
//先将#符号入栈
OPTR.push(‘#‘);
while(true)
{
int b = a+1;
a = str.find_first_of(op,a+1);
if(a==string::npos) break;
if(a!=b)
{
string ss(str,b,a-b);
double d=atof(ss.c_str());
//数据先入栈
OPND.push(d);
}
//运算符优先级比较
int ju = Judge(OPTR.top(),str[a]);
if(-1==ju)//栈外优先级大直接入栈
{
OPTR.push(str[a]);
}
if(0==ju)//栈内外优先级相等则出栈
{
OPTR.pop();
}
if(1==ju)//栈内优先级大,出栈进行运算
{
double d1 = OPND.top();
OPND.pop();
double d2 = OPND.top();
OPND.pop();
d1 = run(OPTR.top(),d2,d1);
//运算结果入栈
OPND.push(d1);
OPTR.pop();
a--;
}
}
//删除表达式最后的‘#‘结束标识符
str.erase(str.length()-1,1);
cout<<str<<" = "<<OPND.top()<<endl;
}

原文地址:https://www.cnblogs.com/gzhynl/p/9610249.html

时间: 2024-10-13 16:32:47

中缀表达式求值模板的相关文章

中缀表达式求值问题

           中缀表达式求值问题 中缀表达式的求值问题是一个比较常见的问题之一,我们通常在编写程序时,直接写出表达式让编译器去处理,很少去关心编译器是怎么对表达式进行求值的,今天我们来一起了解一下其中具体的原理和过程. 表达式一般来说有三种:前缀表达式.中缀表达式.后缀表达式,其中后缀表达式又叫做逆波兰表达式.中缀表达式是最符合人们思维方式的一种表达式,顾名思义,就是操作符在操作数的中间.而前缀表达式和后缀表达式中操作符分别在操作数的前面和操作数的后面.举个例子: 3+2 这个是最简单的

中缀表达式求值 C++ Stack

给一个包含小数的中缀表达式 求出它的值 首先转换为后缀表达式然后利用stack求出值 转换规则: 如果字符为'('  push else if 字符为 ')' 出栈运算符直到遇到'(' else if 字符为'+','-','*','/' { if 栈为空或者上一个运算符的优先级小于当前运算符 push else { 运算符优先级小于等于栈顶运算符的优先级,出栈 然后!将当前运算符入栈! } } 代码 #include<iostream> #include<cstdio> #inc

中缀表达式求值总结

中缀表达式的题目困扰了我两三年,都没去写过..这两天看到2005年提高组的T3要用到所以心血来潮写了一下. 表达式求值借助基本结构应该不用说了是栈,不管手写还是STL都没有太大关系.而中缀表达式最难控制的地方是优先级,算上+-*/^()一共有四个优先级[+-,*/,, ^()](后面会提到一个三级的字符“负号”,这是预留空位). 下面对一个例子进行分析:2*3+4*6/3+17-4^2 那么处理的时候怎么控制优先级呢? 搜到‘+’之前,栈的情况是这样的: 操作数栈:2  3 操作符栈:* 然后搜

刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决

1. 表达式的种类 如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题,作为栈的应用事例,下面介绍表达式的求值过程. 任何一个表达式都是由操作数(亦称运算对象).操作符(亦称运算符)和分界符组成的.通常,算术表达式有3种表示: ①中缀(infix)表示:<操作数><操作符><操作数>,如A+B. ②前缀(prefix)表示: <操作符><操作数><操作数>,如+AB. ③后缀(postfix)表示: <操作

中缀表达式求值

中缀表达式用于计算一个表达式,比如计算器 就是这样实现的 这儿是用栈的数据结构来实现的.首先输入一个字符串,表示一个表达式,然后用一个栈存储数字,另外一个栈存储符号 如果当前运算符优先级比栈顶元素优先级高,则入栈,若当前运算符优先级小于等于栈顶运算符优先级,则从数字栈中弹出两个元素,从符号栈中弹出一个符号,计算结果入栈(数字栈): 代码如下: #include<iostream> using namespace std; #include<cstring> #include<

【数据结构】栈的应用——中缀表达式求值(c++)

头文件: #pragma once #include <iostream> #include <assert.h> #include <string> using namespace std; template<class Type> class SeqStack { public: SeqStack(size_t sz = INIT_SZ); ~SeqStack(); public: bool empty()const; bool full()const;

运算表达式求值模板

表达式计算 使用方法 输入合法的表达式,加减乘除,可以带括号,用空格分开数字和符号,-1为结束标志,比如: 2 * 5 + 3 -1 注意:这是用来算具体答案的,不是转化成后缀表达式输出的,当然,思想是递归建立表达式树,然后后序遍历得逆波兰式,然后用栈计算结果 模板 #include<iostream> #include<string.h> #include<string> #include<stack> //#include<math.h> u

中缀表达式求值问题(栈的应用)

1 #include <iostream> 2 #include<stdlib.h> 3 4 using namespace std; 5 6 #define STACK_INIT_SIZE 100 7 #define STACKINCREASE 10 8 9 //为了简化函数,数据栈和符号栈用了一种结构体(虽然我知道可以用共用体解决问题,嫌烦), 10 //由此导致的后果是接下来所有的运算过程中不允许出现小数,而且由于是利用ASCII表来储存整数, 11 //所以要求运算数以及运

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

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