中缀表达式转换为后缀表达式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;
}
}
接受一个中缀表达式,输出相应的后缀表达式。使用一个栈来存储运算符。
(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;
}
}
相关文章推荐
- 数据结构Java实现06----中缀表达式转换为后缀表达式
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
- 数据结构(C++实现):栈的运用--中缀表达式转换为后缀表达式既 nyoj 257
- 在C++中使用栈来把中缀表达式转换为后缀表达式并求值,简单明了
- 数据结构Java实现06----中缀表达式转换为后缀表达式
- 数据结构Java实现06----中缀表达式转换为后缀表达式
- JAVA实现中缀表达式转换为后缀表达式并计算
- 中缀表达式得到后缀表达式(c++、python实现)
- C/C++ 中缀表达式转换成后缀表达式并求值
- 中缀表达式转换到后缀表达式(java实现)
- 数据结构Java实现06----中缀表达式转换为后缀表达式
- 中缀表达式转换后缀表达式并求值(java实现)
- RGB和HSL之间的转换 C++实现
- 用标准c++实现string与各种类型的转换
- 后缀表达式(逆波兰式)、中缀表达式的转换与求值【转】
- C++实现CString和string的互相转换
- 把中缀表达式转换成等价的后缀表达式
- RGB空间与HSV空间的相互转换(C++实现,修正网上大多数的代码错误)
- 利用栈将 (中缀表达式) 转换成 (后缀表达式)
- 中缀表达式转后缀表达式C++代码