栈的一个应用--求后缀表达式的值

       后缀表达式就是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:(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;
   
}

  

     运算结果如下:

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

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

原文地址:https://www.cnblogs.com/1242118789lr/p/6730699.html