首页 > 其他分享 >Infix to postfix conversion using stack【1月21日学习笔记】

Infix to postfix conversion using stack【1月21日学习笔记】

时间:2024-01-21 22:36:18浏览次数:28  
标签:conversion return 21 postfix top pop char exp

点击查看代码
//Infix to postfix conversion using stack
#include<iostream>
#include<stack>//stack from standard template library(STL)
#include<string>
using namespace std;

string InfixToPostfix(string exp);

bool HasHigherPrecedence(char opr1, char opr2);

bool IsOperator(char c);

bool IsOperand(char c);

int  GetOperatorWeight(char op);

bool IsRightAssociative(char opr);

int main() {
	string expression;
	getline(cin, expression);//与cin>>不同,可以读取空格,直到整行换行符结束
	cout << "Output = " << InfixToPostfix(expression) << "\n";
}

string InfixToPostfix(string exp) {
	stack<char> S;//保存运算符及括号
	string postfix = "";//初始化为空

	for (int i = 0; i < exp.length(); i++) {
		if (exp[i] == ' ' || exp[i] == ',')  continue;
		else if (IsOperator(exp[i])) {
			while (!S.empty() && S.top() != '(' && S.top() != '[' && S.top() != '{' && HasHigherPrecedence(S.top(), exp[i])) {//依次拿出优先级较高(优先级相同时则左结合)运算符放入表达式至碰到开括号
				postfix += S.top();//string的添加操作
				S.pop();
			}
			S.push(exp[i]);//将此运算符放入stack(stack中运算符优先级高的在上面)
		}
		else if (IsOperand(exp[i])) {//直接放入操作数
			postfix += exp[i];
		}
		else if (exp[i] == '('|| exp[i] == '[' || exp[i] == '{' ) {//直接放入开括号
			S.push(exp[i]);
		}
		else if (exp[i] == ')') {//扫描到闭括号则一直pop到开括号
			while (!S.empty() && S.top() != '(') {
				postfix += S.top();
				S.pop();
			}
			S.pop();//pop掉匹配的开括号
		}
		else if (exp[i] == ']') {
			while (!S.empty() && S.top() != '[') {
				postfix += S.top();
				S.pop();
			}
			S.pop();
		}
		else if (exp[i] == '}') {
			while (!S.empty() && S.top() != '{') {
				postfix += S.top();
				S.pop();
			}
			S.pop();
		}
	}

	while (!S.empty()) {//剩下的直接放入
		postfix += S.top();
		S.pop();
	}
	return postfix;
}

bool HasHigherPrecedence(char opr1, char opr2) {
	int w1 = GetOperatorWeight(opr1);
	int w2 = GetOperatorWeight(opr2);
	
	if (w1 == w2) {//优先级相同时则左结合
		if (IsRightAssociative(opr1)) return false;
	    return true;
	}
	return w1 > w2 ? true : false;
}

int  GetOperatorWeight(char opr) {//定义优先级
	int weight = -1;
	switch(opr) {
	case '+':
	case '-':
		weight = 1; break;
	case '*':
	case '/':
		weight = 2; break;
	case '^':
		weight = 3; break;
	//可添加其他运算
	}
	return weight;
}

bool IsRightAssociative(char opr) {
	if (opr == '^')  return true;
	return false;
}

bool IsOperator(char c) {
	if (c == '+' || c == '-' || c == '*' || c == '/'||c=='^')  return true;
	return false;
}

bool IsOperand(char c) {
	if (c >= '0' && c <= '9')  return true;
	return false;
}

标签:conversion,return,21,postfix,top,pop,char,exp
From: https://www.cnblogs.com/whvivy/p/17978583

相关文章

  • 2024-1-21
    2024-1-211787C-RemovetheBracket#include<bits/stdc++.h>#defineendl'\n'#defineintlonglongusingnamespacestd;constintN=2e5+10;intn,k;inta[N];intb[N][2];intdp[N][2];voidsolve(){ cin>>n>>k......
  • 1/21 ST表总结
    RMQ问题:区间最值查询ST表:经过一次预处理后o(1)的离线查询任意区间最值(可重复贡献)利用区间dp的思想 f[i][j]=从i开始的2的j次方的最值f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1];模板voidST(){ for(inti=1;i<=n;i++) f[i][0]=a[i]; for(intj=1;j<25;j......
  • UVA11218的题解
    题目翻译大意有九个人要去KTV唱歌,每三个人为一组分成三组,现在给出了\(n\)种分的组合,输入四个数\(a,b,c,s\)分别代表\(a,b,c\)这三个人的构成一个组合能获得\(s\)分,现在要求最多能获得多少得分。如果无法把分配九个人就输出-1。分析数据范围:看这数据,\(n<81\)不......
  • PG DBA培训21:PostgreSQL性能优化之基准测试
    本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQLPerformanceBenchmarking,学完本课程可以掌握PostgreSQL性能基准测试基础知识,基准测试介绍,基准测试相关指标,TPCC基准测试基础,PostgreSQL测试工具介绍,PostgreSQL性能基准测试案例1之BenchmarkSQL,Benchm......
  • 2024.1.21模拟赛 C题解
    简要题意略思路首先有一个\(O(nk)\)的暴力dp,30pts我们可以发扬人类智慧,构造势能函数\(U_x=\sum_{未选择的点i}dis(i,x)+h_i\),当前在\(x\)点定义\(f_i\)表示走到\(i\)点时势能函数的最小值,\(s_i\)表示\(i\)到起点的距离容易发现只会跨过起点进行转移,于是\(f_i=f_j+2\tim......
  • 闲话1.21
    颓。周日啊,大颓特颓......
  • 2024.1.21模拟赛 B题解
    题目大意略思路首先有一个50pts的网络流暴力考虑按照\(dp\)值分层,发现在同一层内,随着\(i\)递增,\(a_i\)递减由此可以进一步推出每一个点连接的出边,是下一层的一个区间,并且区间是单调的于是可以线段树优化建边,拿到60pts接着考虑模拟网络流,发现如果每次都选择第一条出边的话,就......
  • 2024-01-21 闲话
    chatwithyspmonwhateveryouwant!自主命题闲话确实有点消耗家底,尤其是对我这种没啥家底的人来说。所以能不能来和yspm聊天!想说什么说什么!在家的生活实在是太寂寞了,原先觉得GraphofThought是adaptive的,今天读了一下代码,发现不是adaptive的,幻想破灭的一集。去a......
  • 1.21 && 第二场模拟赛记
    写在前面:非常好模拟赛,9道题,3道不用写,三道原题,两道原题,一道东方题。根据等量代换可得有5道原题。t2原题CF740C赛时理解错题意了,具体咋想的我也忘了,但是我的构造方法是每个区间从0开始构造,如果不在区间内则任意输出。但是正解是找到最小区间然后按区间循环输出即可。......
  • 1.21闲话暨模拟赛题解
    未卜先知推歌:二重变革/洛天依,言和byDELA上午写了模拟赛,下午不给我发代码不让我改题不让我看题面,smjb模拟赛一共9道题,4道原题(2道原题,2道"原"题),抛去3道不写的一共6道题T1「尘世闲游」(原神题)没让写T2「一心净土」(原神题&&原题「CF740C」)题解我这里一共找到......