原题:点击打开链接
一个模拟题目,主要熟悉一下逆波兰式。
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <stack>
#include <stdlib.h>
using namespace std;
char s[300],ss[1000];
int len;
void fun()
{
stack<char> st;
int i=0,j=0;
while(i<len)
{
if(s[i]>='0'&&s[i]<='9'||s[i]==' '){
ss[j++]=s[i];
i++;
}
else if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')
{
if(st.empty()){
st.push(s[i]);
i++;
}
else if(!st.empty())
{
if(s[i]=='+'||s[i]=='-')
{
while(!st.empty())
{
ss[j++]=st.top();
ss[j++]=' ';
st.pop();
}
st.push(s[i]);
i++;
}
else
{
while(!st.empty())
{
char x=st.top();
if(x=='*'||x=='/')
{
ss[j++]=x;
ss[j++]=' ';
st.pop();
}
else
break;
}
st.push(s[i]);
i++;
}
}
}
}
ss[j++]=' ';
while(!st.empty())
{
ss[j++]=st.top();
ss[j++]=' ';
st.pop();
}
}
double jisuan(int n)
{
stack<double> st;
int i=0,j=0;
double sum;
while(i<n)
{
if(ss[i]>='0'&&ss[i]<='9')
{
double x=0;
int j;
for(j=i;j<n;j++)
{
if(ss[j]!=' ')
x=x*10+ss[j]-48;
else
break;
}
st.push(x);
i=j;
}
else if(ss[i]==' ')
{
i++;
}
else if(ss[i]=='+')
{
double x=st.top();
st.pop();
double y=st.top();
st.pop();
sum=x+y;
st.push(sum);
i++;
}
else if(ss[i]=='-')
{
double x=st.top();
st.pop();
double y=st.top();
st.pop();
sum=y-x;
st.push(sum);
i++;
}
else if(ss[i]=='*')
{
double x=st.top();
st.pop();
double y=st.top();
st.pop();
sum=y*x;
st.push(sum);
i++;
}
else if(ss[i]=='/')
{
double x=st.top();
st.pop();
double y=st.top();
st.pop();
sum=y/x;
st.push(sum);
i++;
}
}
return st.top();
}
int main()
{
while(gets(s)!=NULL)
{
memset(ss,0,sizeof(ss));
if(strcmp(s,"0")==0)
break;
len=strlen(s);
fun();
// printf("%s\n",ss);
double sum=jisuan(strlen(ss));
printf("%.2lf\n",sum);
}
return 0;
}