- 堆栈
- 什么是堆栈
- 堆栈的抽象数据类型描述
- 栈的顺序存储实现
堆栈
什么是堆栈
计算机如何进行表达式求值?
算术表达式5+6/2-3*4。
正确理解:
5+6/2-3*4 = 5+3-3*4 = 8-3*4 = 8-12 = -4
由两类对象构成的:
运算数,如2、3、4
运算符号,如+、-、*、/ 不同运算符号优先级不一样
后缀表达式
中缀表达式:运算符号位于两个运算数之间。如 ,a + b * c - d / e
后缀表达式:运算符号位于两个运算数之后。如, a b c *+ d e /-
后缀表达式求值策略:从左向右“扫描”,逐个处理运算数和运算符号
1. 遇到运算数怎么办?如何“记住”目前还不未参与运算的数?
2. 遇到运算符号怎么办?对应的运算数是什么?
6 2 / 3 - 4 2 *+ = ?
6/2-3+4*2
注意后缀的运算数是紧挨着运算符号之前的两个数
启示:需要有种存储方法,能顺序存储运算数, 并在需要时“倒序”输出!
堆栈(Stack):
具有一定操作约束的线性表 只在一端(栈顶,Top)做 插入、删除
插入数据:入栈(Push)
删除数据:出栈(Pop)
后入先出:Last In First Out(LIFO)
堆栈的抽象数据类型描述
类型名称: 堆栈(Stack)
数据对象集:一个有0个或多个元素的有穷线性表。
操作集:长度为MaxSize的堆栈S Stack,堆栈元素item ElementType
1、Stack CreateStack( int MaxSize ): 生成空堆栈,其最大长度为MaxSize;
2、int IsFull( Stack S, int MaxSize ):判断堆栈S是否已满;
3、void Push( Stack S, ElementType item ):将元素item压入堆栈;
4、int IsEmpty ( Stack S ):判断堆栈S是否为空;
5、ElementType Pop( Stack S ):删除并返回栈顶元素
Push 和 Pop 可以穿插交替进行;
按照操作系列 (1)Push(S,A), Push(S,B),Push((S,C),Pop(S),Pop(S),Pop(S) 堆栈输出是? CBA
(2) 而Push(S,A), Pop(S),Push(S,B),Push((S,C),Pop(S),Pop(S) 堆栈输出是? ACB
栈的顺序存储实现
栈的顺序存储结构通常由一个一维数组和一个记录 栈顶元素位置的变量组成。
1.入栈 2.出栈 3.判断 栈满 栈空
typedef int Position;
struct SNode {ElementType *Data; /* 存储元素的数组 */Position Top; /* 栈顶指针 */int MaxSize; /* 堆栈最大容量 */
};
typedef struct SNode *Stack;Stack CreateStack( int MaxSize )
{Stack S = (Stack)malloc(sizeof(struct SNode));S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));S->Top = -1;//top值为零说明栈里有一个元素,-1代表堆栈空S->MaxSize = MaxSize;return S;
}bool IsFull( Stack S )
{return (S->Top == S->MaxSize-1);
}bool Push( Stack S, ElementType X )
{if ( IsFull(S) ) {printf("堆栈满");return false;}else {S->Data[++(S->Top)] = X;return true;}
}bool IsEmpty( Stack S )
{return (S->Top == -1);
}ElementType Pop( Stack S )
{if ( IsEmpty(S) ) {printf("堆栈空");return ERROR; /* ERROR是ElementType的特殊值,标志错误 */}else return ( S->Data[(S->Top)--] );
}
堆栈的其他应用:
函数调用及递归实现
深度优先搜索
回溯算法
。。。