您的位置:首页 > 理论基础 > 数据结构算法

中缀表达式转换为后缀表达式c++的实现(数据结构stack)

2017-05-06 17:15 495 查看
算法描述
接受一个中缀表达式,输出相应的后缀表达式。使用一个栈来存储运算符。
(1)初始化一个空的运算符栈。
(2)在没有到达重罪表达式的结尾以及没有错误发生时,执行以下步骤:
1、获取中缀表达式中的下一个输入标记(常数、变量、算术运算符、左括号、右括号)。
2、如果标记是:
一个左括号:将其压入栈中。
一个右括号:连续弹出并显示栈中的元素,直到遇到一个左括号,但是不要显示这个左括号(如果直到栈为空了还没有找到一个左括号,则是一个错误的中缀表达式)
一个运算符:如果栈为空,或者标记具有比栈顶元素更高的优先级,则将其亚茹栈中。
否则,弹出并显示栈顶的元素;接着继续比较标记和新的栈顶元素。
一个操作数:显示他。
(3)档达到中缀表达式的结尾时,弹出并显示栈中的元素直到栈为空。#include <iostream>
#include <string>
#include <cassert>
#include <cctype>
#include <stack>

using namespace std;

string postfix(string exp)
{
char token;
char topToken;
stack<char> opStack;
string postfixExp;
const string BLANK = " ";
for( int i =0; i < exp.length(); i++)
{
token = exp[i];
switch(token)
{
case ' ': break;
case '(': opStack.push(token);
break;
case ')':
for(;;)
{
assert(!opStack.empty());
topToken = opStack.top();
opStack.pop();
if(topToken == '(') break;
postfixExp.append(BLANK + topToken);
}
break;
case '+': case '-':
case '*': case '/': case '%':
for(;;)
{
if( opStack.empty() || opStack.top() == '(' ||
(token == '*' || token == '/' || token == '%') &&
(opStack.top() == '+' || opStack.top() == '-') )
{
opStack.push(token);
break;
}
else
{
topToken = opStack.top();
opStack.pop();
postfixExp.append(BLANK + topToken);
}
}
break;
default: //操作数
postfixExp.append(BLANK + token);

for(;;)
{
if( !isalnum(exp[i+1]) ) break; //标识符结尾
i++;
token = exp[i];
postfixExp.append(1,token);
}
}
}
//弹出栈中剩余的运算符
for(;;)
{
if (opStack.empty()) break;
topToken = opStack.top();
opStack.pop();
if ( topToken != '(' )
{
postfixExp.append(BLANK + topToken);
}
else
{
cout < " ***Error infix expression *** \n";
break;
}
}

return postfixExp;
}

int main()
{
string infixExp;
cout << "NOTE :Enter # for infix expression to stop.\n";
for(;;)
{
cout << " \nInfix expression? ";
getline(cin,infixExp);

if(infixExp == "#") break;

cout << "Postfix expression is " << postfix(infixExp) << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ RPN