栈的一个应用--求后缀表达式的值
后缀表达式就是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:(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; }
运算结果如下:
此代码仅支持个位数的运算,因此比较简单,写此代码主要是想表达一种思想,如果要计算多位数的后缀表达式,按照这个思想来就好。
夜深了,外面不安全,你快回来吧。