预习日志 项目一 简单计算器的实现

本文介绍了如何使用C++编写一个支持带括号的简单计算器,通过单栈法与队列结合处理带符号优先级的运算,并利用后缀表达式计算结果。同时提及了QT在界面设计中的应用。
摘要由CSDN通过智能技术生成

1.绘制基本流程图(如下)。

2.需要c++基础,进行简单计算器的代码编写工作,且输入的运算表达式还需要支持带括号“(”“)”。使用单栈法与队列结合的方式计算带符号优先级的算数结果。

3.需要学习相关的QT知识来实现计算器的界面设计。

代码参考:

#include<stack>
#include<iostream>
#include<deque>
#include<string>
using namespace std;
 
//判断是否为括号
bool isPra(char c) 
{
    if(c=='('||c==')') 
        return true; 
    else 
        return false;
}
 
//获得符号的优先性
int getPri(char c) 
{
    switch(c)       //循环判断
    {
    case '+':
    case '-':
        return 0;    //如果是加减,返回0
        break;
    case '*':
    case '/':
        return 1;    //如果是乘除,返回1
        break;
    case '(':
    case ')':
        return -1;  //注意,这里将括号设为最低优先级,因此括号不会被弹出,除非遇到右括号
        break;
     }
}
 
//判断符号的优先性
void check(char c, stack<char>& bbb, deque<char>& ccc) 
{  
    if(bbb.empty()) 
    {
        bbb.push(c);
        return;
    }
 
    if(isPra(c)) 
    {
        if(c=='(') 
            bbb.push(c);
        else 
        {
            //弹出所有元素直到遇到左括号
            while(bbb.top()!='(') 
            {  
                char ch = bbb.top();
                ccc.push_back(ch);
                bbb.pop();
            }
 
            //当遇到左括号时,弹出但不加入ccc(后缀表达式中)
            bbb.pop();  
        }
    }
    else    //如果不是括号
    {
        //取出栈顶元素,与当前符号进行优先性比较
        char sym = bbb.top();  
 
        //比较两符号的优先性
        if(getPri(c)<=getPri(sym))  
        {
            //如果c的优先性比栈顶符号小或等于,弹出栈顶元素
            bbb.pop();
            //并将其压入ccc(后缀表达式)中
            ccc.push_back(sym);
            //递归调用check,比较当前符号c与下一个栈顶符号的优先性
            check(c,bbb,ccc);    
        }
        else 
        {
            //如果c比栈顶符号优先级大,那将c压入bbb(操作符栈)中
            bbb.push(c);  
        }
    }
}
 
//从aaa中取出元素,分配元素到bbb和ccc中
void allocate(deque<char>& aaa, stack<char>& bbb, deque<char>& ccc) 
{  
    while(!aaa.empty()) 
    {
        char c = aaa.front();
        aaa.pop_front();
 
        if(c>='0'&&c<='9')
        {
            ccc.push_back(c);
        }
        else 
        {
            //调用check函数,针对不同情况作出不同操作
            check(c,bbb,ccc);  
        }
 
    }
 
    //如果输入结束,将bbb的元素全部弹出,加入后缀表达式中
    while(!bbb.empty()) 
    {  
        char c = bbb.top();
        ccc.push_back(c);
        bbb.pop();
    }
}
 
//计算后缀表达式
void calculate(deque<char>& ccc, stack<int>& ddd) 
{  
    while(!ccc.empty()) 
    {
        char c = ccc.front();
        ccc.pop_front();
        
        //如果是操作数,压入栈中
        if(c>='0'&&c<='9') 
        {
            int op = c-'0';    
            ddd.push(op);     
        }
        else     //如果是操作符,从栈中弹出元素进行计算
        { 
            int op1 = ddd.top();
            ddd.pop();
            int op2 = ddd.top();
            ddd.pop();
            switch(c) 
            {
            case '+':
                ddd.push(op2+op1);
                break;
            case '-':
                ddd.push(op2-op1);
                break;
            case '*':
                ddd.push(op2*op1);
                break;
            case '/':
                ddd.push(op2/op1);  //注意是op2(op)op1而不是op1(op)op2
                break;
            }
        }
    }
}
 
 
int main()
{
    deque<char> aaa;  //盛放中缀表达式
    stack<char> bbb;  //盛放操作符
    deque<char> ccc;    //盛放后缀表达式
    stack<int> ddd;    //计算后缀表达式的辅助栈
    string str;
    cout<<"请输入表达式,按enter结束:"<<endl;
    cin>>str;
    for(int i=0;i!=str.size();++i) 
    {
        //逐一加入每个字符
        aaa.push_back(str[i]);  
    }
 
    //从aaa中取出元素,分配元素到bbb和ccc中
    allocate(aaa,bbb,ccc); 
 
    //计算后缀表达式
    calculate(ccc,ddd);  
    cout<<"计算结果为:"<<ddd.top()<<endl;
    system("pause");
    return 0;
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值