更多C++学习经验,从《C++ Primer》入手学习C++
写一个表达式计算器,实现一个节点类的继承体系如图B-1右,体会面向对象编程
简单版:表达式求值
NC137:表达式求值
请写一个整数计算器,支持加减乘三种运算和括号。
数据结构介绍的逆波兰表达式法
https:
//www.cnblogs.com/lulipro/p/7450886.html
#include <iostream>
#include <stack>
using namespace std;
stack<int> nums;
stack<char> signs;
void clac();
void change(string s);
int solve(string s);
int main()
{
string s;
while(cin>>s)
{
change(s);
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')
{
int j=i;
int tmp=0;
while(j<s.size()&&s[j]>='0'&&s[j]<='9')
{
tmp=tmp*10+s[j]-'0';
j++;
}
nums.push(tmp);
i=j-1;
}else if(s[i]=='('){
signs.push(s[i]);
}else if(s[i]=='+'||s[i]=='-')
{
while(!signs.empty()&&signs.top()!='(')
clac();
signs.push(s[i]);
}else if(s[i]=='*'||s[i]=='/')
{
while(!signs.empty()&&(signs.top()=='*'||signs.top()=='/'))
clac();
signs.push(s[i]);
}else if(s[i]==')')
{
while(!signs.empty()&&signs.top()!='(')
clac();
signs.pop();
}
}
while(!signs.empty())
clac();
int ans=nums.top();
nums.pop();
cout<< ans<<endl;
}
return 0;
}
int com(int a,int b,char c)
{
switch(c)
{
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
if(b!=0)
return a/b;
}
return -1;
}
void clac()
{
int num1=nums.top();
nums.pop();
int num2=nums.top();
nums.pop();
char mc=signs.top();
signs.pop();
nums.push(com(num2,num1,mc));
}
//在负号前面加“0”
void change(string s)
{
for(int i=0;i<s.size();i++)
{
if(s[i]=='-')
{
if(i==0)
s.insert(i, "0");
if(i>0&&s[i-1]=='(')
s.insert(i, "0");
}
}
}
编译原理里面介绍的递归下降法
#include<iostream>
#include<vector>
#include<list>
#include<algorithm>
#include<set>
#include<string>
using namespace std;
int i=0;
int computer(string &str)
{
int num=0;
char flag='+';
list<int> st;
while(i<str.length())
{
if(str[i]=='(')
{
i++;
num=computer(str);
}
while(str[i]>='0'&&str[i]<='9'&&i<str.length())
{
num=num*10+str[i]-'0';
i++;
}
switch(flag)
{
case '+':
st.push_back(num);
break;
case '-':
st.push_back(-num);
break;
case '*':
{
int pro=st.back();
st.pop_back();
st.push_back(pro*num);
break;
}
case '/':
{
int pro=st.back();
st.pop_back();
st.push_back(pro/num);
break;
}
}
num=0;
flag=str[i];
if (str[i] == ')')
{
i++;
break;
}
i++;
}
int sum=0;
while(st.size())
{
sum+=st.back();
st.pop_back();
}
return sum;
}
int main()
{
string str;
while(cin>>str)
{
cout<<computer(str)<<endl;
}
}
复杂版:四则运算
题目描述
输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。
扫描二维码关注公众号,回复:
12665226 查看本文章

逆波兰法:
#include <iostream>
#include <stack>
using namespace std;
stack<int> nums;
stack<char> opera;
void change(string s);
void clac();
int com(int a,int b,char c);
int main()
{
string s;
while(cin>>s)
{
change(s);
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')
{
int j=i;
int tmp=0;
while(j<s.size()&&s[j]>='0'&&s[j]<='9')
{
tmp=tmp*10+s[j]-'0';
j++;
}
nums.push(tmp);
i=j-1;
}else if(s[i]=='+'||s[i]=='-')
{
while(!opera.empty()&&(opera.top()=='+'||opera.top()=='-'||opera.top()=='*'||opera.top()=='/'))
{
clac();
}
opera.push(s[i]);
}else if(s[i]=='*'||s[i]=='/')
{
while(!opera.empty()&&(opera.top()=='*'||opera.top()=='/'))
{
clac();
}
opera.push(s[i]);
}else if(s[i]==')')
{
while(!opera.empty()&&opera.top()!='(')
clac();
opera.pop();
}else if(s[i]==']')
{
while(!opera.empty()&&opera.top()!='[')
clac();
opera.pop();
}else if(s[i]=='}')
{
while(!opera.empty()&&opera.top()!='{')
clac();
opera.pop();
}else if(s[i]=='['||s[i]=='{'||s[i]=='(')
{
opera.push(s[i]);
}
}
while(!opera.empty())
{
clac();
}
int ans=nums.top();
nums.pop();
cout<<ans<<endl;
}
return 0;
}
int com(int a,int b,char c)
{
switch(c)
{
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
}
return -1;
}
void clac()
{
int num1=nums.top();
nums.pop();
int num2=nums.top();
nums.pop();
char op=opera.top();
opera.pop();
nums.push(com(num2,num1,op));
}
void change(string s)
{
for(int i=0;i<s.size();i++)
{
if(s[i]=='-')
{
if(i==0)
s.insert(i, "0");
if(i>0&&(s[i-1]=='['||s[i-1]=='{'||s[i-1]=='('))
s.insert(i, "0");
}
}
}