C表达式求值做加法和乘法

/*
  Name: 表达式 包含乘法和加法, 
  Copyright: hc
  Author: hc
  Date: 06/05/15 16:46
  Description: 思路【数据表达式是先数字再符号再数字,所以就 先读第一数字,以后都认为是符号 和一个数字,这样以后就都可以以判别符号是不是'\n'来判别 
*/

#include<iostream>
#include<stack>
using namespace std;
int main()
{
    int a,c,x,y,z,temp,i=0,j=0;
    char b;
    stack<int> num;//数字栈
    stack<char> exp;//符号栈
    scanf("%d",&a);//先获取一个数字
    num.push(a);//把数据进入数字栈
    
  //  cout<<"读取第"<<++i<<"个数字"<<a<<endl;
      while(scanf("%c",&b)==1)//判别字符
      { 
        // cout<<"读取第"<<++j<<"个符号"<<b<<endl;
         //cout<<a<<endl;
        if(b!='\n')//如果不是结尾
                   {
                                       
                    if(b=='*')//判断是不是乘号
                        {
                                cin>>c;//读一个数字
                                temp=num.top();//取出另一个数字
                                num.pop();//从堆栈中去掉这个数字
                                temp=temp*c;//堆栈数字temp乘以读入的数字c
                               // scanf("%c",&b);//cin>>b;                  //这是一个出错点 
                              //  if (b=='\n') break;
                               num.push(temp);//把乘法结果入栈
                              // cout<<"数字栈中的值有"<<num.top()<<endl;
                        }  
                     else //如果不是乘法那么就是加法
                         {
                                cin>>c;
                                //a=a+c;
                                num.push(c);//数字入栈
                                exp.push(b);      //符号入栈
                         } 
         
                    } 
        else//如果到了文件尾部
       {
                //    cout<<"这是进入到没有标点符号的情况";
                while(!exp.empty())//这个是字符也就是标点符号堆栈,现在都是低级的运算法,加法
                {
                         exp.pop();//符号出栈丢掉
                         x=num.top();//数字赋值
                         num.pop();//数字出栈丢掉
                         y=num.top();//数字赋值
                         num.pop();//数字出栈丢掉
                         z=x+y;//加法
                         num.push(z);//把结果写入到堆栈
                         
                 }
                 break;
       }
    }
    cout<<num.top();//最后数字栈里面存着结果
    system("pause");
    return 0;
    
    
       
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值