【数据结构】逆波兰表达式

此篇文章中默认逆波兰表达式已经转换为后缀表达式

题意简述为;



解决问题的思想为:建立一个栈,把这些数据依次往栈里读,若读到数字入栈,若读到符号将栈顶元素保存到right中,pop掉当前元素,再将栈顶元素保存到left中将结果算出来在入栈,直到算完为止。

代码如下:


#include <iostream>
using namespace std;

#include "stack.hpp"

enum Type
{   
    ADD,
    SUB,
    MUL,
    DIV,
    OP_NUM,
};  
struct Cell
{
    Type _type;
     int num;
};


//逆波兰表达式
long long   CountExp(Cell RPNExp[], int size)
{
    stack<Cell> s1;
    Cell sum;
    sum.num = 0;
     int i = 0;
     for(i=0;i<11;i++)
    {
          if(RPNExp[i]._type == OP_NUM)
         {
             s1.PushStack(RPNExp[i]);
         }
          else
         {
              int right = s1.GetTop().num ;
             s1.PopStack();
              int left = s1.GetTop().num ;
             s1.PopStack();
              switch(RPNExp[i]._type)
             {
              case ADD:
                  sum.num  = left + right;
                  break ;
              case SUB:
                  sum.num  = left - right;
                  break ;
              case MUL:
                  sum.num  = left * right;
                  break ;  
              case DIV :
                  sum.num  = left / right;
                  break ;
              default :
                  break;
             }
             s1.PushStack(sum);

         }
    }

     return sum.num ;
}


void Test6()
{
   Cell RPNExp[] = {
    OP_NUM,12,
    OP_NUM,3,
    OP_NUM,4,
    ADD,0,
    MUL,0,
    OP_NUM,6,
    SUB,0,
    OP_NUM,8,
    OP_NUM,2,
    DIV,0,
    ADD,0,};

     long long num = CountExp(RPNExp,11);
    cout<<num<<endl;

    
}

int main()
{
   Test6();
   return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值