一、后缀表达式
- 中缀表达式:运算符号位于两个运算符之间。如:a+b*c-d/e
- 后缀表达式:运算符号位于两个运算符之后。如:abc*+de/-
要计算后缀表达式:应从右向左“扫描”,逐个处理运算符和运算符号。可使用堆栈储存运算数,在需要时“倒序”输出。
二、堆栈
堆栈(Stack):具有一定操作约束的线性表,只在一端(栈顶,Top)做插入、删除。
- 插入数据:入栈(Push)
- 删除数据:出栈(Pop)
- 后入先出:Last In First Out(LIFO)
数据对象集:一个由0个或多个元素的有穷线性表;
操作集:长度为MaxSize的堆栈S和堆栈元素item。
- 栈的顺序存储实现
栈的顺序存储结构通常是由一个一维数组和一个记录栈顶元素位置的变量组成。如下:
#define MaxSize //储存数据元素的最大个数
typedef struct SNode *Stack;//结构指针
struct SNode
{
ElementType Data[MaxSize];
int Top;
}
(1)入栈
void Push(Stack PtrS,ElementType item)
{
if(PtrS->Top == MaxSize-1)
{
printf("堆栈满");
return;
}
else
{
ptrS->Data[++(PtrS->Top)] = item;
//等于执行(PtrS->Top)++;
//PtrS->Data[PtrS->Top] = item;
return;
}
}
(2)出栈
ElementType Pop(Stack PtrS)
{
if(PtrS->Top == -1)
{
printf("堆栈空");
return ERROR; //ERROR是ElementType的特殊值,标志错误
}
else
{
return (PtrS->Data[(PtrS->Top)--]);
}
}
eg:用一个数组实现两个堆栈,要求最大的利用数组空间,使数组只要有空间入栈操作就可以成功。
我们就可以让这两个栈分别从数组的两头开始向中间生长;当两个栈的栈顶指针相遇时,表示这两个栈都满了。
#define MaxSize //存储数据元素的最大个数
struct DStack
{
ElementType Data[MaxSize];
int Top1; //堆栈1的栈顶指针