表达式的计算
来源:互联网 发布:linux 显示绝对路径 编辑:程序博客网 时间:2024/05/23 11:21
//writen by sunboy
//2007.6.30
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector <string> vec_num,vec_symbol;
string transform(string headExp); //将中缀表达式转化为后缀表达式
int CalrearExp(vector <string> &vec); //计算后缀表达式的值
int stringToint(string s)
...{
int res=0,i;
int len=s.length();
for(i=0;i<len;i++)
...{
res*=10;
res+=(s[i]-'0');
}
return res;
}
int main()
...{
string headExp,rearExp;
int ans;
cout<<"请输入表达式:"<<endl;
cin>>headExp;
rearExp=transform(headExp);
cout<<rearExp<<endl;
ans=CalrearExp(vec_num);
cout<<ans<<endl;
return 0;
}
/**//*
中缀算术表达式转后缀算术表达式
算法:
1 读入运算对象,直接输出
2 ( 运算符进栈
3 ) 运算符,栈内的最上一个( 以上的运算符退栈,(也退栈
4 读入运算符,进入运算栈
4.1 后进栈的运算符 > 先进栈的运算符,运算符进栈 (优先级比较)
4.2 后进栈的运算符 <= 先进栈的运算符,将栈内的运算符退栈输出,再进栈
5 # 结束符
*/
string transform(string headExp)
...{
string res,tmp;
int i,j,len=headExp.length();
i=0;
char ch;
int top;
while(i<len)
...{
ch=headExp[i++];
switch(ch)
...{
case '(':
vec_symbol.push_back ("(");
break;
case ')':
top=vec_symbol.size ();
j=top-1;
while(vec_symbol[j]!="(")
...{
vec_num.push_back (vec_symbol[j]);
vec_symbol.erase(vec_symbol.begin ()+j);
j--;
}
vec_symbol.erase(vec_symbol.begin ()+j);
break;
case '+':
case '-':
top=vec_symbol.size ();
j=top-1;
while(j>=0&&vec_symbol[j]!="(")
...{
vec_num.push_back (vec_symbol[j]);
vec_symbol.erase(vec_symbol.begin ()+j);
j--;
}
if(ch=='+')
vec_symbol.push_back ("+");
else
vec_symbol.push_back ("-");
break;
case '*':
case '/':
top=vec_symbol.size ();
j=top-1;
while(j>=0&&vec_symbol[j]=="*"||vec_symbol[j]=="/")
...{
vec_num.push_back (vec_symbol[j]);
vec_symbol.erase(vec_symbol.begin ()+j);
j--;
}
if(ch=='*')
vec_symbol.push_back ("*");
else
vec_symbol.push_back ("/");
break;
default:
tmp="";
while(ch>='0'&&ch<='9')
...{
tmp+=ch;
ch=headExp[i++];
}
i--;
vec_num.push_back (tmp);
}
}
for(i=vec_symbol.size ()-1;i>=0;i--)
vec_num.push_back (vec_symbol[i]);
for(i=0;i<vec_num.size ();i++)
...{
res+=vec_num[i];
res+=" ";
}
return res;
}
int CalrearExp(vector <string> &vec)
...{
int res,i;
vector<int> vec_cal;
int len=vec.size ();
for(i=0;i<len;i++)
...{
if(vec[i]=="+")
...{
vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]+vec_cal[vec_cal.size ()-1];
vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1);
}else if(vec[i]=="-")
...{
vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]-vec_cal[vec_cal.size ()-1];
vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1);
}else if(vec[i]=="*")
...{
vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]*vec_cal[vec_cal.size ()-1];
vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1);
}else if(vec[i]=="/")
...{
if(vec_cal[vec_cal.size ()-1]==0)
...{
cout<<"除零错误"<<endl;
vec_cal[vec_cal.size ()-1]=1;
}
vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]/vec_cal[vec_cal.size ()-1];
vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1);
}else
...{
int num=stringToint(vec[i]);
vec_cal.push_back (num);
}
}
res=vec_cal[0];
return res;
}
//2007.6.30
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector <string> vec_num,vec_symbol;
string transform(string headExp); //将中缀表达式转化为后缀表达式
int CalrearExp(vector <string> &vec); //计算后缀表达式的值
int stringToint(string s)
...{
int res=0,i;
int len=s.length();
for(i=0;i<len;i++)
...{
res*=10;
res+=(s[i]-'0');
}
return res;
}
int main()
...{
string headExp,rearExp;
int ans;
cout<<"请输入表达式:"<<endl;
cin>>headExp;
rearExp=transform(headExp);
cout<<rearExp<<endl;
ans=CalrearExp(vec_num);
cout<<ans<<endl;
return 0;
}
/**//*
中缀算术表达式转后缀算术表达式
算法:
1 读入运算对象,直接输出
2 ( 运算符进栈
3 ) 运算符,栈内的最上一个( 以上的运算符退栈,(也退栈
4 读入运算符,进入运算栈
4.1 后进栈的运算符 > 先进栈的运算符,运算符进栈 (优先级比较)
4.2 后进栈的运算符 <= 先进栈的运算符,将栈内的运算符退栈输出,再进栈
5 # 结束符
*/
string transform(string headExp)
...{
string res,tmp;
int i,j,len=headExp.length();
i=0;
char ch;
int top;
while(i<len)
...{
ch=headExp[i++];
switch(ch)
...{
case '(':
vec_symbol.push_back ("(");
break;
case ')':
top=vec_symbol.size ();
j=top-1;
while(vec_symbol[j]!="(")
...{
vec_num.push_back (vec_symbol[j]);
vec_symbol.erase(vec_symbol.begin ()+j);
j--;
}
vec_symbol.erase(vec_symbol.begin ()+j);
break;
case '+':
case '-':
top=vec_symbol.size ();
j=top-1;
while(j>=0&&vec_symbol[j]!="(")
...{
vec_num.push_back (vec_symbol[j]);
vec_symbol.erase(vec_symbol.begin ()+j);
j--;
}
if(ch=='+')
vec_symbol.push_back ("+");
else
vec_symbol.push_back ("-");
break;
case '*':
case '/':
top=vec_symbol.size ();
j=top-1;
while(j>=0&&vec_symbol[j]=="*"||vec_symbol[j]=="/")
...{
vec_num.push_back (vec_symbol[j]);
vec_symbol.erase(vec_symbol.begin ()+j);
j--;
}
if(ch=='*')
vec_symbol.push_back ("*");
else
vec_symbol.push_back ("/");
break;
default:
tmp="";
while(ch>='0'&&ch<='9')
...{
tmp+=ch;
ch=headExp[i++];
}
i--;
vec_num.push_back (tmp);
}
}
for(i=vec_symbol.size ()-1;i>=0;i--)
vec_num.push_back (vec_symbol[i]);
for(i=0;i<vec_num.size ();i++)
...{
res+=vec_num[i];
res+=" ";
}
return res;
}
int CalrearExp(vector <string> &vec)
...{
int res,i;
vector<int> vec_cal;
int len=vec.size ();
for(i=0;i<len;i++)
...{
if(vec[i]=="+")
...{
vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]+vec_cal[vec_cal.size ()-1];
vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1);
}else if(vec[i]=="-")
...{
vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]-vec_cal[vec_cal.size ()-1];
vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1);
}else if(vec[i]=="*")
...{
vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]*vec_cal[vec_cal.size ()-1];
vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1);
}else if(vec[i]=="/")
...{
if(vec_cal[vec_cal.size ()-1]==0)
...{
cout<<"除零错误"<<endl;
vec_cal[vec_cal.size ()-1]=1;
}
vec_cal[vec_cal.size ()-2]=vec_cal[vec_cal.size ()-2]/vec_cal[vec_cal.size ()-1];
vec_cal.erase (vec_cal.begin ()+vec_cal.size ()-1);
}else
...{
int num=stringToint(vec[i]);
vec_cal.push_back (num);
}
}
res=vec_cal[0];
return res;
}
- 算术表达式的计算
- 算术表达式的计算
- 表达式的计算
- 字符串表达式的计算
- 计算表达式的值
- 表达式计算的中序转后序
- 计算表达式的值
- 前缀表达式的计算
- 表达式计算的问题
- 后缀表达式的计算
- 后缀表达式的计算
- 计算表达式的值
- Java 表达式的计算
- 后缀表达式的计算
- 简单的表达式计算
- 后缀表达式的计算
- 后缀表达式的计算
- 后缀表达式的计算
- 征服私服游戏 C#服务端源代码研究 与讨论 加群36864102
- 调试SQL Server的存储过程及用户定义函数
- 亚瑟复活了!
- goodbye, XTU
- C#下用P2P技术实现点对点聊天(1) (转载)
- 表达式的计算
- 如何跟踪调试存储过程
- 高级语言研究论坛 www.luyikk.com 里面有很多经典文章
- SQL Server连接中的三个最常见错误
- 用Visual C++操作INI文件
- Java基础:J2SE技术中标准组件介绍大全
- .NET学习站点大收集
- 将思绪从电脑前拉回我的。淘宝小店。或许有你所需!
- Beijing alone