zoukankan      html  css  js  c++  java
  • 栈的一个应用--求后缀表达式的值

           后缀表达式就是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:(2 + 1) * 3 , 即2 1 + 3 *  = 3 3* = 9,计算后缀表达式的值最好的办法就是用堆栈,实现代码如下:

       

    #include <iostream>
    #include <string>
    #include <stdlib.h>
    using namespace std;
    
    typedef struct StackRecord* Stack;
    #define EmptyTos -1      //栈是否为空的标志位
    #define MinStackSize 10  //栈的最小容量为10
    
    struct StackRecord
    {
       int Capacity;   //栈的容量
       int TopOfStack;   //栈的顶端
       int *Array;     //一个数组
    };
    //////////////////函数声明///////////////////
    int IsEmpty(Stack s);    //检查一个栈是否为空
    int IsFull (Stack s);     //检查一个栈是否满了
    void MakeEmpty (Stack s);  //创建一个空栈的“栈底”
    Stack CreatStack (int MaxElements);   //创建一个栈,大小为MaxElements
    void DisposeStack (Stack s);    //释放一个栈
    void Push(int x, Stack s);   //进栈
    int Pop(Stack s);     //出栈,返回栈顶元素
    int Top(Stack s);    //返回栈顶元素,不出栈
    
    
    //////////////////函数定义///////////////////
    int IsEmpty(Stack s)
    {
       return s->TopOfStack == EmptyTos;
    }
    
    int IsFull (Stack s)
    {
       if(s->TopOfStack > s->Capacity )
       {
          cout << "stack full" << endl;
           return 1;
       }
       else
       {
          return 0;
       }
    }
    
    void MakeEmpty (Stack s)
    {
       s->TopOfStack = EmptyTos;
    }
    
    Stack CreatStack (int MaxElements)
    {
       Stack s;
       if (MaxElements < MinStackSize)
       {
          cout << "stack size is too small" << endl;
       }
       s = static_cast<Stack> (malloc(sizeof(struct StackRecord)));
       if(s == NULL)
       {
          cout << "out of space!!!";
       }
       s->Array =static_cast<int*>(malloc(sizeof(int)*MaxElements));
       if(s->Array == NULL)
       {
         cout << "out of space!!!";
       }
       s->Capacity = MaxElements;
       MakeEmpty(s);
       return s;
    }
    
    void DisposeStack (Stack s)
    {
       if (s != NULL)
       {
          free(s->Array );
          free(s);
       }
    }
    
    void Push(int x, Stack s)
    {
        if(IsFull(s))
        {
           cout << "Full stack" << endl;
        }
        else
        s->Array [++(s->TopOfStack )] = x;
    }
    
    int Pop(Stack s)
    {
       if(!IsEmpty(s))
       {
          return s->Array [(s->TopOfStack)--];
       }
       else
       {
           cout << "Empty stack " << endl;
           return -1;
       }
    }
    
    int Top(Stack s)
    {
         if(!IsEmpty(s))
       {
          return s->Array [s->TopOfStack];
       }
       else
       {
           cout << "Empty stack " << endl;
           return -1;
       }
    }
    
    int main ()
    {
       string str;
        cout << "please enter the postfix expression:" << endl;
        cin >> str;
        
        char c = ' ';
        int result = 0, as = 0;
        Stack stack_1 = CreatStack (15);    //创建一个堆栈
        for(unsigned i = 0; i != str.size (); ++i)
        {
            c = str[i];
            as = int(str[i]);          //把字符转换为对应的ascll值
            if(as >= 48 && as <= 57)  //如果为数字
            {
                Push(as-48, stack_1);   //进栈,进栈的为数,而不是ascll值,所以要减48
            }
            else
            {
               switch (as)
               {
                   
                   case 43 :  //加号    
                      result = Pop(stack_1) + Pop(stack_1); 
                      Push(result, stack_1);
                      break;
                   case 45 :  //减号                        
                      result = Pop(stack_1) - Pop(stack_1); 
                      Push(result, stack_1);
                      break;
                   case 42 :  //乘号                        
                      result = Pop(stack_1) * Pop(stack_1); 
                      Push(result, stack_1);
                      break;
                    case 47 :  //乘号                        
                      result = Pop(stack_1) / Pop(stack_1); 
                      Push(result, stack_1);
                      break;
    
               }
                   
            }
    
        }
        cout << Pop(stack_1) << endl;    //输出结果
        DisposeStack (stack_1);
       return 0;
       
    }
    

      

         运算结果如下:

          此代码仅支持个位数的运算,因此比较简单,写此代码主要是想表达一种思想,如果要计算多位数的后缀表达式,按照这个思想来就好。

         夜深了,外面不安全,你快回来吧。

  • 相关阅读:
    【Linux】Vim编辑器-批量注释与反注释
    java_部署jar
    linux_UBUNTU 12.04 上使用 SQUID 架设HTTP正向代理服务器
    crawler_java应用集锦9:httpclient4.2.2的几个常用方法,登录之后访问页面问题,下载文件_设置代理
    linux_coom _ Linux文件比较,文本文件的交集、差集与求差
    linux_之sed用法
    算法-跑道与马-百度面试题
    《Python》常用内置模块
    《Python》内置方法进阶和常用模块
    《Python》反射、内置方法(__str__,__repr__)
  • 原文地址:https://www.cnblogs.com/1242118789lr/p/6730699.html
Copyright © 2011-2022 走看看