//无括号的计算器
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
using namespace std;
map<char,int> mp; //映射
stack<int> sa1; //定义一个int栈
stack<char> sa2; //定义一个char栈
int fun(int a1,int a2,char c3) //运算操作
{
int ans;
if(c3=='+') ans=a2+a1;
if(c3=='-') ans=a2-a1;
if(c3=='*') ans=a2*a1;
if(c3=='/') ans=a2/a1;
return ans;
}
int main()
{
mp['+']=1;mp['-']=1;mp['*']=2;mp['/']=2;mp['#']=0; //通过映射建立优先级
char s[1000],c3;
int c1,c2;
scanf("%s",s);
sa2.push('#');
for(int i=0;i<strlen(s);)
{
if(s[i]>='0'&&s[i]<='9')
{
int a=0;
while(s[i]>='0'&&s[i]<='9') //将字符串转化为整型
{
a=a*10+s[i]-'0';
i++;
}
sa1.push(a); //将a入栈
}
else
{
while(mp[s[i]]<=mp[sa2.top()]) //优先级判断
{
c1=sa1.top();sa1.pop() ;
c2=sa1.top();sa1.pop() ;
c3=sa2.top();sa2.pop() ;
int x=fun(c1,c2,c3);
sa1.push(x);
}
sa2.push(s[i]) ;
i++;
}
}
while(sa2.empty()==0)
{
if(sa2.top() =='#') break;
c1=sa1.top();sa1.pop() ;
c2=sa1.top();sa1.pop() ;
c3=sa2.top();sa2.pop() ;
int x=fun(c1,c2,c3);
sa1.push(x);
}
int ans=sa1.top() ;
printf("%d\n",ans);
return 0;
}
有括号的计算器
//有括号的计算器
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
using namespace std;
map<char,int> mp;
stack<int> sa1;
stack<char> sa2;
int fun(int a1,int a2,char c3)
{
int ans;
if(c3=='+') ans=a2+a1;
if(c3=='-') ans=a2-a1;
if(c3=='*') ans=a2*a1;
if(c3=='/') ans=a2/a1;
return ans;
}
int main()
{
mp['+']=1;mp['-']=1;mp['*']=2;mp['/']=2;mp['#']=0;mp['(']=3;mp[')']=-1;
char s[1000],c3;
int c1,c2;
scanf("%s",s);
sa2.push('#');
for(int i=0;i<strlen(s);)
{
if(s[i]>='0'&&s[i]<='9')
{
int a=0;
while(s[i]>='0'&&s[i]<='9')
{
a=a*10+s[i]-'0';
i++;
}
sa1.push(a);
}
else
{
while(mp[s[i]]<=mp[sa2.top()])
{
if(sa2.top()=='(') break;
c1=sa1.top();sa1.pop() ;
c2=sa1.top();sa1.pop() ;
c3=sa2.top();sa2.pop() ;
int x=fun(c1,c2,c3);
sa1.push(x);
}
if(s[i]==')')
sa2.pop() ;
else
sa2.push(s[i]) ;
i++;
}
}
while(sa2.empty()==0)
{
if(sa2.top() =='#') break;
c1=sa1.top();sa1.pop() ;
c2=sa1.top();sa1.pop() ;
c3=sa2.top();sa2.pop() ;
int x=fun(c1,c2,c3);
sa1.push(x);
}
int ans=sa1.top() ;
printf("%d\n",ans);
return 0;
}
hdu 1237(小数型的)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
using namespace std;
map<char,int> mp;
double fun(double a1,double a2,char c3)
{
double ans;
if(c3=='+') ans=a2+a1;
if(c3=='-') ans=a2-a1;
if(c3=='*') ans=a2*a1;
if(c3=='/') ans=a2/a1;
return ans;
}
int main()
{
mp['+']=1;mp['-']=1;mp['*']=2;mp['/']=2;mp['#']=0;
char s1[1000];
char s[1000],c3;
double c1,c2;
while(gets(s1))
{
if(strcmp(s1,"0")==0) break;
stack<double> sa1;
stack<char> sa2;
int j=0;
for(int i=0;i<strlen(s1);i++) //预处理 除去空格
{
if(s1[i]!=' ')
s[j++]=s1[i];
}
s[j]='\0';
sa2.push('#');
for(int i=0;i<strlen(s);)
{
if(s[i]>='0'&&s[i]<='9')
{
double a=0;
while(s[i]>='0'&&s[i]<='9')
{
a=a*10+s[i]-'0';
i++;
}
sa1.push(a);
}
else
{
while(mp[s[i]]<=mp[sa2.top()])
{
c1=sa1.top();sa1.pop() ;
c2=sa1.top();sa1.pop() ;
c3=sa2.top();sa2.pop() ;
double x=fun(c1,c2,c3);
sa1.push(x);
}
sa2.push(s[i]) ;
i++;
}
}
while(sa2.empty()==0)
{
if(sa2.top() =='#') break;
c1=sa1.top();sa1.pop() ;
c2=sa1.top();sa1.pop() ;
c3=sa2.top();sa2.pop() ;
double x=fun(c1,c2,c3);
sa1.push(x);
}
double ans=sa1.top() ;
printf("%.2f\n",ans);
}
return 0;
}