后缀表达式
中缀表达式:运算符号位于两个运算数之间
后缀表达式:运算符号位于两个运算数之后
后缀表达式求值策略:从左向右“扫描”,逐个处理运算数和运算符号
遇到运算数后先“记住”运算的数,不进行运算,遇到运算符号后,把最近记住的两个运算数进行运算
因此,在使用过程中需要有种存储方法,能顺序存储运算数并在需要时“倒序”输出——也就是堆栈
堆栈
堆栈(Sk):具有一定操作约束的线性表
只在一端(栈顶,Top)做插入、删除
插入数据:入栈(Push)
删除数据:出栈(Pop)
后入先出:Last In First Out(LIFO)
堆栈的抽象数据类型描述
类型名称:堆钱(Stek)
敷据对象集:一个有个或多个元素的有穷线性表。
操作集:长度为MaxSize的堆栈S ∈ Stack,堆栈元素item ∈ElementType
I、Stack CreateStack(int MaxSize):生成空堆栈,其最大长度为MaxSize:
2、int IsFull(Stack S,int MaxSize:判断堆栈s是否己满:
3、void Push(Stack S,ElementType item:将元素item压入堆栈:
4、int1 sEmpty(Stack S):判断堆找s是否为空:
5、ElementType Pop(Stack S):删除并返回栈顶元素:
栈的顺序存储实现
栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。
一个堆栈
#define MaxSize<储存数据元素的最大个数>
typedef struct SNode *Stack;
struct SNodef
{
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:
return;
}
}
(2)出栈
ElementType Pop(Stack PtrS)
{
if (PtrS->Top ==-1)
{
printf(“堆栈空");
return ERROR;
}
else
return (PtrS->Data[(PtrS->Top)--]);
}
两个堆栈
#define MaxSize<存储数据元素的最大个数>
struct DStack
ElementType Data[MaxSize];
int Top1;
int Top2;
}S;
S.Top1=-1;
S.Top2 MaxSize;
(1)入栈
void Push(struct DStack *ptrs,ElementType item,int Tag
{
if(PtrS->Top2-PtrS->Top1=1){
printf("堆栈满");
return ;
}
if(Tag==1)
PtrS->Data[++(PtrS->Top1)]=item;
else
PtrS->Data[--(ptrS->Top2)]item;
}
(2)出栈
ElementType Pop(struct DStack *ptrs,int Tag)
{
if(Tag=1){
if(PtrS->Top1=-1)
{
printf("堆栈l空");
return NULL;
}
else return PtrS->Data[(PtrS->Topl)--];
}
else
{
if(PtrS->Top2=MaxSize)
{
printf("堆栈2空");
return NULL;
else return ptrS->Data[(PtrS->Top2)++];
}
}