求C语言不用堆栈实现混合运算的简单计算器程序 30

课设要求是,编写一个简单计算器,功能尽量模仿WINDOWS的计算器,不作界面要求.本来编了个很简单的计算器,但老师说没有考虑算法,应该做一个可以进行复杂运算的计算器.比如... 课设要求是,编写一个简单计算器,功能尽量模仿WINDOWS的计算器,不作界面要求.本来编了个很简单的计算器,但老师说没有考虑算法,应该做一个可以进行复杂运算的计算器.比如,3+4*5-2=21.但是我没有学过堆栈.求如题计算器,可以在VC运行.
求大神相助啊!!!最佳答案追加50!!!
展开
 我来答
荆路朋
2013-07-06
知道答主
回答量:0
采纳率:0%
帮助的人:0
展开全部

原来写过一个,加减乘除还有括号,你看看行不行。

#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;
}
追问
您现在在线吗?能否给我解释下程序
追答
可以啊
百度网友d580670
2013-07-07
知道答主
回答量:0
采纳率:0%
帮助的人:0
展开全部
zhidao.baidu.com/question/563994419.html?from=1277a&ssid=0&uid=336BB0453B2B29BF4DC2A308016A5AC9&pu=sz@1321_1004,ta@_2_2.1__,os@android&bd_page_type=1&init=big&step=11

看下baidu里面前几天刚写的一个
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
?>

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式