您的位置:首页 > 其它

逆波兰表达式的实现(也叫后缀表达式)

2015-07-24 17:41 295 查看
本文主要偏重实现如何将字符串表达式转换为逆波兰表达式。

关于其讲解参考我转载的一篇博文:http://www.cnblogs.com/vpoet/p/4659546.html

先说说优先级:

() +- */%(从左到右递增)

下面先简单再梳理一下:

1.建立两个栈,一个为N(数据栈),一个为OP(运算符栈)

2.将字符串从左向右遍历,把数据压入数据栈,把运算符压入运算符的栈

关于运算符压栈的规则:⑴ 如果OP为空或者为待压栈操作符为左括号则直接将运算符压入栈

           ⑵ 如果待压栈操作符的优先级大于栈顶操作符则直接入栈

           ⑶ 如果栈顶操作符的优先级大于待压栈操作符,则将OP栈顶的操作符依次压入N知道

            遇到左括号或者OP为空则停止,此时压入该操作符到OP栈顶中

           ⑷ 如果遇到右括号则将OP栈中的元素依次弹出压入N中直到遇到左括号为止,同时弹

            出左括号并且右括号不压入OP

           ⑸ 最后将OP中的元素依次弹出并压入N中,将N弹出并逆序输出则是最终的逆波兰表达式

代码实现如下:

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

int operateprior(char a1)
{
int prior;

switch(a1)
{
case '(':
prior=0;
break;
case ')':
prior=0;
break;
case '+':
prior=1;
break;
case '-':
prior=1;
break;
case '*':
prior=2;
break;
case '/':
prior=2;
break;
case '%':
prior=2;
break;
}
return prior;
}

char* NiBoLanFun(char* Str)
{
stack<char> N;
stack<char> OP;

while(*Str!='\0')
{
if(*Str>='0'&&*Str<='9')
{
N.push(*Str);
Str++;
}
else
{
if(*Str=='('||OP.empty())
{
OP.push(*Str++);
}
else
{
if(*Str==')')
{
while(!OP.empty())
{
//cout<<"OP.top="<<OP.top()<<endl;
if(OP.top()!='(')
{
N.push(OP.top());
}
OP.pop();
if(OP.top()=='(')
{
OP.pop();
break;
}
}
Str++;
}
else
{
while(!OP.empty()&&operateprior(*Str)<operateprior(OP.top()))
{
N.push(OP.top());
OP.pop();
}
OP.push(*Str++);
}
}
}

}

while(!OP.empty())
{
N.push(OP.top());
OP.pop();
}

cout<<"The Trans string size="<<N.size()<<endl;
char* TransStr;
TransStr=new char[N.size()+1];
memset(TransStr,'\0',N.size()+1);
int i=N.size()-1;
while(!N.empty())
{
TransStr[i]=N.top();
N.pop();
i--;
}
return TransStr;
}

void main()
{
char str[50]={'\0'};
char *AfterStr;
cout<<"Please input the operate string: ";
cin>>str;
AfterStr=NiBoLanFun(str);
cout<<"The Trans String is: "<<AfterStr<<endl;
return;
}


运行截图:





其实逆波兰表达式的转换并不难,只是过程冗杂,条件判断较多。

OK,就到这里吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: