栈(Stack)乃一特定数据结构,仅允在其一端施行插入或删除操作。
- 线性表之基本操作
- InitStack(S):初始化栈,构造一空栈S并分配内存空间。
- DestroyStack(S):销毁栈,释放栈S所占用的内存空间。
- Push(S, x):进栈,若栈未满,则将x加入使其成为新栈顶。
- Pop(S, x):出栈,若栈非空,则弹出栈顶元素并使x接收之。
- GetTop(S, x):读栈顶元素,若栈非空,则x接收栈顶元素。
- StackEmpty(S):判断栈是否为空,若为空则返回真,否则返回假。
此乃逻辑结构之一,拥有两种存储方式。其中之一为顺序存储,即利用一组地址连续的存储单元存放自栈底至栈顶的数据元素(如数组),并辅以一个指向栈顶元素的指针(top指针)。
此top指针有两种表示法:一是指向栈顶元素本身,空栈时top为-1;另一种是栈顶指针top指向栈顶元素的下一个位置,空栈时top指向0。以下代码采用第一种表示法。
顺序存储之不足在于其大小固定,当元素不足时会造成空间浪费。然共享栈可提高空间利用率,两栈共享同一片空间,自两端向中间增长。
另一存储方式则为链式存储,即链栈,通常以单链表实现之。
无论入栈或出栈操作,皆在表头进行。入栈即以头插法插入新节点,出栈则删除表头节点。采用带头结点与不带头结点之方式略有差异。
(带头节点 vs 不带头节点)
队列(Queue)为另一线性表结构,仅允一端入队,另一端出队。
- 队列基本操作
- InitQueue(Q):初始化队列,构造一空队列Q。
- DestroyQueue(Q):销毁队列并释放其内存空间。
- EnQueue(Q, x):若队列未满,将x加入使之成为新队尾。
- DeQueue(Q, x):若队列非空,则删除队头元素并以x接收之。
- GetHead(Q, x):若队列非空,则队头元素赋值给x。
- QueueEmpty(Q):判断队列是否为空,若为空则返回真。
队有着两种存储结构:顺序存储及非顺序存储。以数组为代表的顺序存储设有队头及队尾指针。非顺序存储可通过特定机制判断队空及队满状态。
对于双端队列(Deque),其两端皆可进行入队及出队操作。根据限制条件,又可分为输出受限及输入受限的双端队列。