今天去騰訊廣州筆試去了,結果很悲劇。不過沒關係,只有在不斷的被鄙視的過程中才能茁壯成長,加油!
1.輸入:一個字符串,其中包括四種運算符:+、-、*、/和一些整數(0-9)。PS:沒有括號。
輸出:運算結果(double)。實例:輸入1*2+4/2-4+5 輸出:5.0
分析:先把乘除運算做完,把減運算變成後面那個數的負數,並把前三種運算的結果輸入到棧中。後面的就全部是加運算了。
代碼:
#include <iostream>
#include <stdlib.h>
#include <stack>
using namespace std;
double Calc(const char *str)
{
stack <double> data;
int i=0;
double result,temp;
while(str[i]!='\0')
{
switch(str[i])
{
case '+':
break;
case '-':
temp=-(str[++i]-'0');
data.push(temp);
break;
case '*':
result=data.top();
data.pop();
temp=str[++i]-'0';
result*=temp;
data.push(result);
break;
case '/':
result=data.top();
data.pop();
temp=str[++i]-'0';
result/=temp;
data.push(result);
break;
default:
result=str[i]-'0';
data.push(result);
break;
}
i++;
}
while(data.size()>1)
{
result=data.top();
data.pop();
temp=data.top();
data.pop();
result+=temp;
data.push(result);
}
result=data.top();
data.pop();
return result;
}
int main()
{
char str[30];
cin>>str;
cout<<Calc(str)<<endl;
return 0;
}
如果把整數變成多位,算法如下:
#include <iostream>
#include <stack>
#include <stdlib.h>
using namespace std;
int GetData(const char *str,int *i)
{
int size=strlen(str)-1,j=0;
char ch[size];
while(true)
{
if(str[j]=='+'||str[j]=='-'||str[j]=='*'||str[j]=='/'||str[j]=='\0')
break;
else
{
ch[j]=str[j];
j++;
(*i)++;
}
}
(*i)--;
ch[j]='\0';
return atoi(ch);
}
double Calc(const char *str)
{
stack <double> data;
char ch;
int i=0;
double result,temp;
while(str[i]!='\0')
{
switch(str[i])
{
case '+':
break;
case '-':
i++;
temp=-GetData(str+i,&i);;
data.push(temp);
break;
case '*':
result=data.top();
data.pop();
i++;
temp=GetData(str+i,&i);;
result*=temp;
data.push(result);
break;
case '/':
result=data.top();
data.pop();
i++;
temp=GetData(str+i,&i);
result/=temp;
data.push(result);
break;
default:
result=GetData(str+i,&i);
data.push(result);
break;
}
i++;
}
while(data.size()>1)
{
result=data.top();
data.pop();
temp=data.top();
data.pop();
result+=temp;
data.push(result);
}
result=data.top();
data.pop();
return result;
}
int main()
{
char str[50];
cin>>str;
cout<<Calc(str)<<endl;
return 0;
}