Infix to postfix 用stack模板,表达式没有括号

#include<stack>
#include<iostream>
#include<string>
using namespace std;

//优先级判断
char compare(char opt, char si)
{
	if((opt==‘+‘||opt==‘-‘)&&(si==‘*‘||si==‘/‘)
		return ‘<‘;
	else if(opt==‘#‘)
		return ‘<‘;
	return ‘>‘;
}

//判断是否为运算符
bool isOp(char c)
{
	if(c==‘+‘||c==‘-‘||c==‘*‘||c==‘/‘)
		return true;
	return false;
}

int main()
{
	stack<char>op;
	stack<char>num;
	op.push(‘#‘);
	num.push(‘#‘);

	string s;
	cin>>s;

	for(int i=0;i<s.size();i++)
	{
		if(!isOp(s[i]))
			num.push(s[i]);
		else
		{
			char c=compare(op.top(),s[i]);
			if(c==‘<‘)
				op.push(s[i]);
			else
			{
				num.push(op.top());
				op.pop();
				op.push(s[i]);
			}
		}
	}

	while(op.top()!=‘#‘)
	{
		num.push(op.top());
		op.pop();
	}

    string s1="";

    while(num.top!=‘#‘)
    {
	     s1=s1+num.top();
		 num.pop();
    }	

     for(int i=0;i<s1.size()/2;i++)
	 {
		 char temp=s1[i];
		 s1[i]=s1[s1.size()-1-i];
		 s1[s1.size()-1-i]=temp;
	 }		 

     cout<<s1<<endl;	 

     return 0;
}

  

时间: 2024-08-03 15:23:44

Infix to postfix 用stack模板,表达式没有括号的相关文章

Infix to postfix without &#39;(&#39; and &#39;)&#39;

#include<iostream> #include<stack> #include<string> #include<deque> using namespace std; char compare(char tp, char op) { if (((tp == '+' || tp == '-') && (op == '*' || op == '/')) || tp == '#') return '<'; return '>'

stack计算表达式的值

9.52 使用stack对象处理带圆括号的表达式.遇到左圆括号时,将其标记下来.当你在一个左括号之后遇到右圆括号时,弹出stack对象中这两边括号之间的元素,直到遇到左括号,将左括号也一起弹出栈. 接着在stack对象中压入一个值,用以表明这个用一对圆括号括起来的表达式已经被替换. 程序如下: #include<iostream> #include<stack> #include<string> using namespace std; int main() { sta

C++ Primer 学习笔记_45_模板(三):缺省模板参数(借助标准模板容器deque实现Stack模板)、成员模板、关键字typename

一.缺省模板参数 1.stack内存能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: template <typename T, typename CONT = std::deque<T> > //此处末尾必须有空格,否则编译出错 class Stack { - private: CONT c_; }; 如果没有传第二个参数,默认为deque 双端队列,当然我们也可以传递std::vector<T> 2.示例:借助

C++与数据结构 -- stack实现表达式求值[注释版]

有好多朋友评论以前的那篇博文说:代码中间没有注释.由于课程一直比较紧张,所以答应的注释直到今天才写, 发表出来,与大家共享! #include <map> #include <stack> #include <string> #include <iostream> #include <fstream> using namespace std; //为+,-,*,/运算符 设定优先级 map<char,int> priority; vo

矩阵连乘 和表达式加括号求最大值

矩阵连乘核心代码1 for(int i=0;i<=n;i++) 2 m[i][j]=0; 3 for(r=1;r<n;r++) 4 for(i=1;i<=n-r;i++) 5 { 6 j=i+r; 7 m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; 8 s[i][j]=i; 9 for(k=i+1;k<j;k++) 10 { 11 int t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; 12 if(t<m[i][j]) 13

Basic Calculator - Stack(表达式计算器)

978. Basic Calculator https://www.lintcode.com/problem/basic-calculator/description public class Solution { /** * @param s: the given expression * @return: the result of expression */ public int calculate(String s) { // Write your code here Stack<Int

逆波兰式与表达式求解

/*************** 逆波兰式即后缀表示法 预处理 ---- 中序表达式->逆序表达式(infix to postfix) 算法: while(表达式非空) if (遇到操作数) 直接输出 else if (遇到操作符op) op是( 直接入栈s op是) s.push输出,直到( op是四则运算,则 if (s为空 || s.top为( || op 优先级高于 s.top) op 入栈 else s.push输出 if (!s.empty) s.push输出 计算 算法: if (

C++用后缀表达式(逆波兰)求四则表达式值,采用STL中的stack

简介: 20 世纪50 年代, 波兰逻辑学家JanLukasiewicz ,想到了一种不需要括号的后缀表达法,我们也把它称为逆波兰( Reverse Polish Notation, RPN) 表示,对于"如9 + (3 -1 ) X3 +10-/2 " ,如果要用后缀表示法应该是: "9 3 1-3*+10 2 / + " ,这样的表达式称为后缀表达式. 中缀表达式转后缀表达式规则: 从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分

用栈计算数学表达式的值

用栈计算数学表达式的值 计算一个简单数学表达式(+ - * / ( ))的结果,有的这些符号的计算,常常需要看优先级来决定先算哪部分,计算机就是这个原理 两个概念: 中缀表达式(infix Expression):运算符写在两个操作数之间(运算符有一定的优先级,可以用圆括号改变运算顺序) 前/后缀表达式(prefix/postfix Expression):运算符写在两个表达式之前/之后(运算符没有优先级,没有括号,遇到运算符对它前面的两个操作数进行求值) 如中缀表达式“6*(8+7)/5”,换