有中缀表达式转换为后缀表达式并求值
来源:互联网 发布:java短信验证码通道 编辑:程序博客网 时间:2024/05/16 18:29
/*将中缀表达式转化为后缀表达式的算法思想
首先需要分配两个栈,一个作为临时存储运算符的栈s1(含一个结束符号),一个作为输入后缀表达式的栈S2(空栈),是栈可以先放入优先级最低的运算符#,注意
中缀式应以最低优先级的运算符结束,可以指定其他字符,不一定非#不可。从中缀表达式的左端开始取字符,程序步骤如下
(1)若取出的是数字,将改运算数直接送入S2栈
(2)若取出的字符是运算符,则将该运算符与S1栈站定元素优先级比较,
如果该运算符的优先级大于S1栈栈顶运算符的优先级,则将该运算符进S1栈,
否则将S1栈栈顶运算符弹出,送入S2栈中直至S1栈栈顶运算符优先级低于(不包括等于)该运算符优先级,则将该运算符送入S1栈
(3)若取出的字符是‘(’,则直接送入S1栈栈顶,
(4)若取出的字符是‘)’,则将距离S1栈栈顶最近的‘(’之间的运算符,逐个出栈,依次送入S2栈,此时抛弃‘(’;
(5)重复上面的1~4步骤,直至处理完所有的输入字符
(6)若取出的字符是‘#’则将S1栈内的所有元素出栈(不包括‘#’)依次送入S2栈
完成以上步骤,S2栈便为后缀表达式的输出结果,不过S2应作逆序处理,便可以便可以照做后缀表示计算了
*/
#include<iostream>
#include<string.h>
using namespace std;
const int maxsize=100;
template<class T>
class stack
{
public:
stack()
{
top=0;
}
bool isEmpty()
{
if(top==0)
return true;
else
return false;
}
void push(T x)
{
s[++top]=x;
}
void pop()
{
top--;
}
T gettop()
{
return s[top];
}
private:
T s[maxsize];
int top;
};
//将中缀表达式转化为后缀表达式
void zhuanhua(char inorder[],char post[],int &m)
{
int n=strlen(inorder);
stack<char>czf;
for(int i=0;i<n;i++)
{
if(inorder[i]>'0'&&inorder[i]<'9')
{
post[m]=inorder[i];
m++;
}
if(inorder[i]=='(')
czf.push(inorder[i]);
if(inorder[i]=='+')
{
if(!czf.isEmpty()&&(czf.gettop()=='*'||czf.gettop()=='/'||czf.gettop()=='-'))
{
post[m++]=czf.gettop();
czf.pop();
czf.push(inorder[i]);
}
else
{
czf.push(inorder[i]);
}
}
if(inorder[i]=='-')
{
if(!czf.isEmpty()&&(czf.gettop()=='*'||czf.gettop()=='/'))
{
post[m++]=czf.gettop();
czf.pop();
czf.push(inorder[i]);
}
else
{
czf.push(inorder[i]);
}
}
if(inorder[i]=='*'||inorder[i]=='/')
{
czf.push(inorder[i]);
}
if(inorder[i]==')')
{
while(czf.gettop()!='(')
{
post[m++]=czf.gettop();
czf.pop();
}
czf.pop();//弹出(
}
}
while(!czf.isEmpty())
{
post[m++]=czf.gettop();
czf.pop();
}
}
int yunsuan(char post[],int n)
{
stack<int>ss;//定义int型堆栈存放操作数每次运算的结果
int a,b,c,result;
for(int i=0;i<n;i++)
{
if(post[i]>'0'&&post[i]<'9')
{
ss.push(post[i]-'0');
}
if(post[i]=='-')
{
b=ss.gettop();
ss.pop();
b=ss.gettop();
ss.pop();
c=a-b;
ss.push(c);
}
if(post[i]=='+')
{
b=ss.gettop();
ss.pop();
a=ss.gettop();
ss.pop();
c=a+b;
ss.push(c);
}
if(post[i]=='*')
{
b=ss.gettop();
ss.pop();
a=ss.gettop();
ss.pop();
c=a*b;
ss.push(c);
}
if(post[i]=='/')
{
b=ss.gettop();
ss.pop();
a=ss.gettop();
ss.pop();
c=a/b;
ss.push(c);
}
}
result=ss.gettop();
ss.pop();
return result;
}
void main()
{
char c;
char ss[100];
char post[100];
int m=0;
int j=0;
cout<<"输入中缀表达的值,以#结束"<<endl;
while(c!='#')
{cin>>c;
ss[j]=c;
j++;
}
zhuanhua(ss,post,m);
cout<<"转换后的后缀表达式的值"<<endl;
for(int i=0 ;i<m;i++)
{
cout<<post[i];
}
cout<<endl;
cout<<"后缀表达式的值"<<endl;
cout<<yunsuan(post,m);
}
- 有中缀表达式转换为后缀表达式并求值
- 栈的运用(中缀表达式转换为后缀表达式,并对后缀表达式求值。)
- 表达式求值(中缀表达式转换为后缀表达式)
- 中缀表达式转换成后缀表达式并求值
- 中缀表达式转换成后缀表达式并求值
- C/C++ 中缀表达式转换成后缀表达式并求值
- 中缀表达式转换成后缀表达式并求值
- 中缀表达式转换成后缀表达式并求值
- 中缀表达式转换成后缀表达式并求值
- 中缀表达式转换成后缀表达式并求值
- 中缀表达式转换成后缀表达式并求值
- 中缀表达式转换后缀表达式并求值(java实现)
- 中缀表达式转换后缀表达式并求值(java实现)
- 中缀表达式转换成后缀表达式并求值
- 栈:中缀表达式转换成后缀表达式并求值
- **中缀表达式转换成后缀表达式并求值**
- 中缀表达式转换为后缀表达式并求值(栈的使用)
- 中缀表达式转换为前缀及后缀表达式并求值【摘】
- c语言文件读写,例子
- openstack nova Folsom版中使用quantum,虚拟机无法访问外部网络的解决办法
- JAVA设计模式九:--Command(命令模式)
- 优秀程序员的45个习惯
- 序列化和反序列化
- 有中缀表达式转换为后缀表达式并求值
- 查询表的锁
- WS_BORDER以及WS_EX_CLIENTEDGE的研究
- “System.Configuration.ConfigurationSettings.AppSettings”已过时
- 图片上动态添加文字
- 《自己动手做操作系统》保护模式阅读报告
- 新浪微博 爬取实现之微博登录
- JAVA设计模式十:--strategy(策略者模式)
- B 树C++实现