堆栈是一种抽象数据类型(ADT),常用于大多数编程语言.它被命名为stack,因为它的行为类似于真实世界的堆栈,例如 - 一副牌或一堆盘子等.
真实世界的堆栈只允许在一端进行操作.例如,我们只能从堆栈顶部放置或移除卡或板.同样,Stack ADT仅允许一端的所有数据操作.在任何给定的时间,我们只能访问堆栈的顶部元素.
此功能使其成为LIFO数据结构. LIFO代表Last-in-first-out.这里,首先访问最后放置(插入或添加)的元素.在堆栈术语中,插入操作称为 PUSH 操作,删除操作称为 POP 操作.
下图描绘了一个堆栈及其操作 :
可以通过数组,结构,指针和链接列表实现堆栈.堆栈可以是固定大小的堆栈,也可以具有动态调整大小的感觉.在这里,我们将使用数组实现堆栈,这使得它成为固定大小的堆栈实现.
堆栈操作可能涉及初始化堆栈,使用它然后去初始化它.除了这些基本内容之外,堆栈用于以下两个主要操作 :
push() : 在堆栈上推送(存储)元素.
pop() : 从堆栈中删除(访问)元素.
当数据被推入堆栈时.
要有效地使用堆栈,我们还需要检查堆栈的状态.出于同样的目的,将以下功能添加到堆栈;
peek() 去;获取堆栈的顶部数据元素,而不删除它.
isFull() : 检查堆栈是否已满.
isEmpty() : 检查堆栈是否为空.
我们始终保持指向堆栈上最后一个PUSHed数据的指针.由于此指针始终表示堆栈的顶部,因此命名为 top . top 指针提供了堆栈的最高值而没有实际删除它.
首先我们应该了解支持堆栈函数的过程 :
peek()函数的算法 :
begin procedure peek return stack[top] end procedure
用C编程语言实现peek()函数 :
示例
int peek() { return stack[top]; }
isfull()函数算法 :
begin procedure isfull if top equals to MAXSIZE return true else return false endif end procedure
用C编程语言实现isfull()函数 :
示例
bool isfull() { if(top == MAXSIZE) return true; else return false; }
isempty()函数的算法 :
begin procedure isempty if top less than 1 return true else return false endif end procedure
C编程语言中isempty()函数的实现略有不同.我们初始化顶部为-1,因为数组中的索引从0开始.因此我们检查顶部是否低于零或-1以确定堆栈是否为空.这是代码 :
示例
bool isempty() { if(top == -1) return true; else return false; }
将新数据元素放入堆栈的过程称为推动操作.推送操作涉及一系列步骤;
步骤1 : 检查堆栈是否已满.
步骤2 : 如果堆栈已满,则产生错误并退出.
步骤3 : 如果堆栈未满,则增加顶部以指向下一个空白区域.
步骤4 ;将数据元素添加到堆栈位置,顶部指向该位置.
步骤5 : 返回成功.
如果链表用于实现堆栈,那么在步骤3中,我们需要动态分配空间.
推送操作的简单算法可以推导如下 :
begin procedure push: stack, data if stack is full return null endif top ← top + 1 stack[top] ← data end procedure
在C中实现此算法非常简单.请参阅以下代码 :
示例
void push(int data) { if(!isFull()) { top = top + 1; stack[top] = data; } else { printf("Could not insert data, Stack is full.\n"); } }
从堆栈中删除内容时访问内容,被称为流行操作.在pop()操作的数组实现中,实际上并未删除数据元素,而是将 top 递减到堆栈中的较低位置以指向下一个值.但是在链表实现中,pop()实际上删除了数据元素并释放了内存空间.
Pop操作可能涉及以下步骤 :
第1步 : 检查堆栈是否为空.
第2步 : 如果堆栈为空,则产生错误并退出.
步骤3 : 如果堆栈不为空,则访问 top 所指向的数据元素.
步骤4 : 将top的值减1.
步骤5 : 返回成功.
一个简单的Pop操作算法可以推导如下 :
begin procedure pop: stack if stack is empty return null endif data ← stack[top] top ← top - 1 return data end procedure
在C中实现此算法,如下 :
示例
int pop(int data) { if(!isempty()) { data = stack[top]; top = top - 1; return data; } else { printf("Could not retrieve data, Stack is empty.\n"); } }
对于C编程语言的完整堆栈程序.