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

此代码仅支持个位数的运算,因此比较简单,写此代码主要是想表达一种思想,如果要计算多位数的后缀表达式,按照这个思想来就好。
夜深了,外面不安全,你快回来吧。
浙公网安备 33010602011771号