一、堆栈
堆栈是编程中有用的数据结构。就像一堆盘子彼此叠放。
想一想用这样一堆盘子可以做的事情
在上面放一个新盘子
卸下顶部盘子
持续来回做实验就知道了堆栈的意义
如果要将板放在底部,则必须先卸下顶部的所有板。这种安排称为“后进先出”-放置的最后一个元素是第一个外出元素。
LIFO堆栈原理
用编程的术语来说,将一个元素放在堆栈的顶部称为“推”,而将一个元素删除则称为“弹出”。
在上图中,尽管元顶部3最后才保留,但它首先被移除-因此它遵循后进先出(LIFO)原则。
堆栈的基本操作
堆栈是一个对象,或更具体地说,是一个允许执行以下操作的抽象数据结构(ADT):
Push
:将元素添加到堆栈顶部Pop
:从堆栈顶部删除元素IsEmpty
:检查堆栈是否为空IsFull
:检查堆栈是否已满Peek
:获取顶部元素的值而不删除它
堆栈数据结构的工作
操作如下:
称为TOP用于跟踪堆栈中的顶部元素。
初始化堆栈时,将其值设置为-1,以便可以通过比较来检查堆栈是否为空
TOP == -1
。推送元素时,增加了TOP并将新元素放置在所指向的位置TOP。
弹出元素时,返回由指向的元素TOP并降低其值。
推入之前,检查堆栈是否已满
弹出之前,检查堆栈是否已为空
Python,C和C ++中的堆栈实现
最常见的堆栈实现是使用数组,但是也可以使用列表来实现。
C:
// Stack implementation in C
#include
#include
#include "math.h"
/*堆栈最大存储元素基数*/
#define MAX 10
int count = 0;
// Creating a stack
struct stack
{
int items[MAX];//堆栈元素数组
int top;
};
typedef struct stack st;
void createEmptyStack(st *s){
s->top = -1;
}
// Check if the stack is full
int isfull(st *s){
if (s->top == MAX - 1)
return 1;
else
return 0;
}
// Check if the stack is empty
int isempty(st *s){
if (s->top == -1)
return 1;
else
return 0;
}
// Add elements into stack
void push(st *s, int newitem){
if (isfull(s))
{
printf("STACK FULL");
}
else
{
s->top++;//类似索引递增
s->items[s->top] = newitem;
}
count++;//计算次数=个数=添加几个元素
}
// Remove element from stack
void pop(st *s){
if (isempty(s))
{
printf("\n STACK EMPTY \n");
}
else
{
printf("Item popped= %d", s->items[s->top]);//--的形式从数组里移除元素
s->top--;//逐一减去
}
count--;
printf("\n");
}
// Print elements of stack
void printStack(st *s){
printf("Stack: ");
for (int i = 0; i < count; i++)
{
printf("%d ", s->items[i]);
}
printf("\n");
}
// 执行 code
int main(){
int ch,i;
st *s = (st *)malloc(sizeof(st));
/*分配一个sizeof(st)大小的空间,并且把该空间的地址赋给st指针类型的p*/
createEmptyStack(s);
#if 0