标签:
#ifndef POSTFIX_TO_NIFIXEXPRESS_H
#define POSTFIX_TO_NIFIXEXPRESS_H
#include<iostream>
#include<string>
#include<stack>
/************************************************************************/
/* 中缀表达式转前缀表达式
建立一个栈来保存运算符,和一个字符容器存字符及运算符的输出。
从后向前扫描中缀表达式:
1、如果遇到的是普通字符那么存入容器中
2、如果遇到的是‘)’,存入容器中
3、如果遇到的是运算符(大于等于栈顶的优先级就入栈,否则弹栈)
如果当前栈为空或者当前运算符的优先级大于等于栈顶元素的优先级,那么入栈。
如果栈顶元素是‘)’,还是入栈。
如果当前运算符的优先级小于栈顶元素的优先级,那么弹栈存入容器中,一直到栈顶元素为‘)’或
者当前运算符的优先级大于或者等于栈顶元素的优先级。将当前运算符入栈。
4、如果遇到‘(’,那么弹栈存入容器一直遇到到‘)’,将‘)’弹出
5、返向输出容器中的字符
*/
/************************************************************************/
std::string nifixExpressToPrefix(std::string &nifixExp){
std::stack<char> operStack;
std::string prefixExp;
for(auto iter=nifixExp.rbegin(); iter!=nifixExp.rend(); iter++){
if(*iter!=‘*‘&&*iter!=‘\\‘&&*iter!=‘+‘&&*iter!=‘-‘&&*iter!=‘(‘&&*iter!=‘)‘){
prefixExp.push_back(*iter);
}else if(*iter==‘)‘){
operStack.push(*iter);
}else if(*iter==‘(‘){
while(operStack.top()!=‘)‘){
prefixExp.push_back(operStack.top());
operStack.pop();
}
operStack.pop();
}else if(*iter==‘*‘||*iter==‘\\‘){
operStack.push(*iter);
}else if(*iter==‘+‘||*iter==‘-‘){
if(operStack.empty()){
operStack.push(*iter);
}else{
if(operStack.top()==‘-‘||operStack.top()==‘+‘||operStack.top()==‘)‘){
operStack.push(*iter);
}else{
while(!operStack.empty()){
if(operStack.top()==‘)‘||operStack.top()==‘+‘||operStack.top()==‘-‘){
break;
}
prefixExp.push_back(operStack.top());
operStack.pop();
}
operStack.push(*iter);
}
}
}
}
while(!operStack.empty()){
prefixExp.push_back(operStack.top());
operStack.pop();
}
std::string strResult;
for(auto iter=prefixExp.rbegin(); iter!=prefixExp.rend(); iter++){
strResult.push_back(*iter);
}
return strResult;
}
#endif
#ifndef NIFIX_TO_POSTFIX_H
#define NIFIX_TO_POSTFIX_H
#include<iostream>
#include<string>
#include<stack>
/************************************************************************/
/* 中缀表达式转后缀表达式
建立一个运算符的栈,从左向右开始扫描中缀表达式。
1、如果是字符则直接输出
2、如果是‘(’,那么入栈。
3、如果是运算符:(大于栈顶的优先级就入栈,否则弹栈)
如果栈顶的元素是‘(’或者当前运算符的优先级比栈顶元素优先级高,那么入栈。
如果当前的运算符的优先级比栈顶的优先级低或者相等,那么就弹栈输出,一直输出到栈顶的运算符
的优先级比当前运算符优先级低或者栈为空,以及栈顶为‘(‘。将当前的运算符压入栈。
4、如果是‘)’,那么一直弹栈输出,一直弹到第一次看到‘(’
*/
/************************************************************************/
std::string nifixToPostfix(const std::string &nifixExp){
std::stack<char> operaStack;
std::string postfixStr;
for(auto iter=nifixExp.begin(); iter!=nifixExp.end(); iter++){
if(*iter!=‘*‘&&*iter!=‘\\‘&&*iter!=‘+‘&&*iter!=‘-‘&&*iter!=‘(‘&&*iter!=‘)‘){
postfixStr.push_back(*iter);
}else if(*iter==‘(‘){
operaStack.push(‘(‘);
}else if(*iter==‘)‘){
while(operaStack.top()!=‘(‘){
postfixStr.push_back(operaStack.top());
operaStack.pop();
}
operaStack.pop();
}else if(*iter==‘*‘||*iter==‘\\‘){
if(operaStack.empty()){
operaStack.push(*iter);
}else{
if(operaStack.top()==‘+‘||operaStack.top()==‘-‘||operaStack.top()==‘(‘){
operaStack.push(*iter);
}else{
while(!operaStack.empty()){
if(operaStack.top()==‘(‘||operaStack.top()==‘+‘||operaStack.top()==‘-‘){
break;
}
postfixStr.push_back(operaStack.top());
operaStack.pop();
}
operaStack.push(*iter);
}
}
}else if(*iter==‘+‘||*iter==‘-‘){
if(operaStack.empty()){
operaStack.push(*iter);
}else{
while(!operaStack.empty()){
if(operaStack.top()==‘(‘){
break;
}
postfixStr.push_back(operaStack.top());
operaStack.pop();
}
operaStack.push(*iter);
}
}
}
while(!operaStack.empty()){
postfixStr.push_back(operaStack.top());
operaStack.pop();
}
return postfixStr;
}
#endif
标签:
原文地址:http://www.cnblogs.com/yml435/p/4784293.html