用栈实现计算器的举例阐述

本文给出QT代码实现表达式计算的示例,提醒代码注释有错误,仅供参考,且代码是从QT截取的部分,需用QT Create。文中结合具体表达式,如(2+1*3)、(2*1+3),详细展示了符号栈和数字栈的操作过程及出栈计算步骤。

注意:代码中的注释有些错误,此文仅供参考;代码是从QT上截取的部分,不能直接运行,需用QT Create。
需要结合代码看:

举例:(2+1*3)

第一次:符号栈(
第二次:数字栈2
第三次:符号栈+;因为栈顶为(,自己不为)
第四次:数字栈1
第五次:符号栈*;因为自己比栈顶+的权值大
第六次:数字栈3
第七次:符号栈):因为自己比栈顶*的权值大

出栈
第一次:出栈)
第二次:因为*,执行13,弹出,弹出1、3,压入3
第二次:因为+,执行2+3,弹出+,弹出2、3,压入5
第三次:弹出(
执行完毕,返回5

(2*1+3)

第一次:符号栈(
第二次:数字栈2
第三次:符号栈*;因为栈顶为(,自己不为)
第四次:数字栈1
第五次:前面条件均不符合:+的权重比小,且栈顶不为(,符号栈不空
执行出栈 因为栈顶此时的符号位为
,所以执行操作,执行21,压入2;
再次返回while判断符号+,因为栈顶为(,自己不为),
所以符号栈+
第六次:数字栈3
第七次:)导致前面不满足条件,执行出栈操作,因为符号),出栈)
第八次:因为+,执行2+3,弹出2、3,压入5,弹出+
第九次:因为(,出栈(
执行完毕,返回5

代码:

void Widget::on_equalButton_clicked()
{

    int signFlag=0;
    if((*express.begin())=='-')                           //在运算之前,把最前面的符号位给去掉,并进行记录保存
    {
        signFlag=1;
        express.remove(0,1);
    }
    else if((*express.begin())=='+')
    {
        signFlag=0;
        express.remove(0,1);
    }
   // ui->inputLineEdit->setText(express);


    //以(1+2)为例
    if(express.size()!=0 && (*express.begin()!=')') && checkError(express))    //核实所给的计算式
    {
       QByteArray ba;
       ba.append(express);      //把QString转换成QByteArray
       char *str = ba.data();   //把QByteArray转换成char *
       QStack<int> s_num, s_opt;                                                //定义一个先进后出的数据类型    即为栈
       int i = 0, tmp = 0, num1, num2;                                          //i计数

       while (str[i] != '\0' || s_opt.empty() != true)                          //判断是否为空
       {
           if (str[i] >= '0' && str[i] <= '9')    //运算数
           {
               tmp = tmp * 10 + str[i] - '0';                                   //数字位放在一起
               i++;
               if (str[i] > '9' || str[i] < '0')   //运算符
               {
                   s_num.push(tmp);                                             //将之前的合出来的数字压入栈中
                   tmp = 0;
               }
           }
           else                                  //运算符
           {
               //运算符进栈
               if (s_opt.empty() == true || Priority(str[i]) > Priority(s_opt.top()) ||
                   (s_opt.top() == '(' && str[i] != ')'))
               {
                   s_opt.push(str[i]);                                           //将符号位压入栈中
                   i++;                                                          //移到下一位
                   continue;                                                     //直到符号栈中为空,优先级没有栈顶的符号位高,且栈顶不为(现在的符号为不为);
                   //接着跳过此if操作
               }

               //出栈不计算
               if (s_opt.top() == '(' && str[i] == ')')                         //如果符号位栈顶为(,且现在的符号位为),则进行符号位出栈操作,即出现()现象
               {
                   s_opt.pop();
                   i++;                                                         //移到下一位
                   continue;                                                    //继续while循环
               }                                                                                   //执行第一次while,符号栈压入一个(
                                                                                                   //第二次数字栈压入一个1
                                                                                                    //第三次,符号栈压入一个+,因为没有(的权值大
                                                                                                    //第四次,数字栈压入一个2
                                                                                                    //第五次,符号栈压入一个),
                                                                                                    //开始进行出栈操作
                                                                                                    //目前,数字栈有 1 2;符号栈有( +);

               //出栈计算
               if ((str[i] == ')' && s_opt.top() != '(') || Priority(str[i]) <= Priority(s_opt.top()) ||
               (str[i] == '\0' && s_opt.empty() != true))
               {
                   char opt = s_opt.top();                                   //符号位位栈顶的符号位
                   s_opt.pop();                                              //弹出栈顶的符号位
                   switch(opt)
                   {
                       case '+':
                           num1 = s_num.top();
                           s_num.pop();
                           num2 = s_num.top();
                           s_num.pop();
                           s_num.push(num1 + num2);
                           break;
                       case '-':
                           num1 = s_num.top();
                           s_num.pop();
                           num2 = s_num.top();
                           s_num.pop();
                           s_num.push(num2 - num1);
                           break;
                       case '*':
                           num1 = s_num.top();
                           s_num.pop();
                           num2 = s_num.top();
                           s_num.pop();
                           s_num.push(num1 * num2);
                           break;
                       case '/':
                           num1 = s_num.top();
                           s_num.pop();
                           num2 = s_num.top();
                           s_num.pop();
                           s_num.push(num2 / num1);
                           break;                              //第一次,将)弹出
                   }
                   continue;                                 //第二次case,因为之前弹出来的是+,那么将弹出两个数字位1和2,并压入3;对它们进行相加运算并弹出。第二次符号位
                                                             //(,将其弹出,此时只有数字位不为空,为3
               }

           }

       }

       if(signFlag == 1)
       {
           express = "-" + QString::number(s_num.top());
           ui->inputLineEdit->setText(express);
       }
       else
       {
           ui->inputLineEdit->setText(QString::number(s_num.top()));
       }
      //ui->inputLineEdit->setText(num);

    }
    else
    {
        QString tmpexpress="error input!";
        ui->inputLineEdit->setText(tmpexpress);
    }
}
源码链接: https://pan.quark.cn/s/a4b39357ea24 银行信贷业务作为银行业务的关键构成部分,涵盖了银行向客户提供的各类融资服务,例如贷款、担保以及信用证等。此类业务致力于协助企业与个人解决资金需求问题,进而推动经济活动的开展。银行通过信贷业务获取利息收入,同时需承担相应风险,以保障资金的稳定与流转。 **信贷定义** 信贷意味着银行运用自身资本及信誉为客户提供资金支持,而客户则需以支付利息、费用并偿还本金为前提条件。这种业务模式不仅包含直接贷款,还包括为客户的债务承担提供担保。依照会计准则,信贷业务可分为表内业务与表外业务,前者对银行的资产负债表产生直接影响,后者则不直接关联。 **信贷业务划分标准** 1. **依据会计核算归属**:表内信贷(如贷款、贴现)和表外信贷(如承兑、保证)。 2. **根据期限划分**:短期(不超过1年)、中期(1至5年)与长期(超过5年)。 3. **按照担保方式分类**:信用信贷(无担保)和担保信贷(保证、抵押、质押)。 4. **按照币种区分**:本币信贷与外币信贷。 5. **按照性质和用途区分**:固定资产贷款、流动资金贷款、循环额度贷款、消费贷款等。 6. **按照贷款组织形式区分**:普通贷款、联合贷款和银团贷款。 7. **按照资金来源区分**:信贷资金贷款、委托贷款和境外筹资转贷款。 8. **按照授信对象区分**:公司类信贷与个人类信贷。 **信贷业务产品** 1. **流动资金贷款**:用于企业日常运营周转或临时性资金需求。 2. **固定资产贷款**:用于投资固定资产项目。 3. **房地产开发贷款**:用于土地开发及房屋建设所需资金。 4. **循环额度贷款**:满足企业...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值