求C语言不用堆栈实现混合运算的简单计算器程序 30
课设要求是,编写一个简单计算器,功能尽量模仿WINDOWS的计算器,不作界面要求.本来编了个很简单的计算器,但老师说没有考虑算法,应该做一个可以进行复杂运算的计算器.比如...
课设要求是,编写一个简单计算器,功能尽量模仿WINDOWS的计算器,不作界面要求.本来编了个很简单的计算器,但老师说没有考虑算法,应该做一个可以进行复杂运算的计算器.比如,3+4*5-2=21.但是我没有学过堆栈.求如题计算器,可以在VC运行.
求大神相助啊!!!最佳答案追加50!!! 展开
求大神相助啊!!!最佳答案追加50!!! 展开
2个回答
展开全部
原来写过一个,加减乘除还有括号,你看看行不行。
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
double getD(char s[],int *i)
{
int j=*i;
double re=0.0;
while(s[j]>='0'&&s[j]<='9')
re=re*10+s[j++]-'0';
if(s[j]!='.')
{
(*i)=(j--);
return re;
}
int k=10;
j++;
while(s[j]>='0' && s[j]<='9')
{
re=re+(s[j++]-'0')*1.0/k;
k*=10;
}
(*i)=(j--);
return re;
}
int getF(char s[],int i) //找到右括号
{
int a=1;
while(a>0)
{
i++;
if(s[i]=='(') a++;
if(s[i]==')') a--;
}
return i;
}
double f(char s[],int k,int e)
{
stack<double> vs,vs1;
stack<char> fs,fs1;
char ch;
double a,b,re=0;
int i=k,j,l=strlen(s);
while(i<=e)
{
ch=s[i];
switch(ch){
case '+':
fs.push(ch);
break;
case '-':
fs.push(ch);
break;
case '*':
a=vs.top();
vs.pop();
i++;
if(s[i]=='(')
{
j=getF(s,i);
b=f(s,i+1,j-1);
i=j;
}
else
{
b=getD(s,&i);
i--;
}
vs.push(a*1.0*b);
break;
case '/':
a=vs.top();
vs.pop();
i++;
if(s[i]=='(')
{
j=getF(s,i);
b=f(s,i+1,j-1);
i=j;
}
else
{
b=getD(s,&i);
i--;
}
vs.push(a*1.0/b);
break;
case '(':
j=getF(s,i);
b=f(s,i+1,j-1);
vs.push(b);
i=j;
break;
default:
a=getD(s,&i);
i--;
vs.push(a);
break;
}
i++;
}
while(!fs.empty())
{
fs1.push(fs.top());
fs.pop();
}
while(!vs.empty())
{
vs1.push(vs.top());
vs.pop();
}
fs=fs1;
vs=vs1;
while(!fs.empty())
{
a=vs.top();
vs.pop();
b=vs.top();
vs.pop();
ch=fs.top();
fs.pop();
if(ch=='+') vs.push(a+b);
else vs.push(a-b);
}
a=vs.top();
vs.pop();
return a;
}
int main()
{
int t;
char s[1010];
printf("输入表达式个数:");
scanf("%d",&t);
while(t--)
{
printf("输入表达式,以等号结束:");
scanf("%s",s);
printf("计算结果:%.2lf\n",f(s,0,strlen(s)-2));
printf("----------------------------------\n");
}
return 0;
}
追问
您现在在线吗?能否给我解释下程序
追答
可以啊
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询