栈的定义与说明
栈是线性表的一种,特点是只能在栈的一端进行插入与删除,这一端叫做栈顶。与之相对的,另外一端叫做栈底。
最先被插入的元素会被放在最下方(栈底)。而从栈中往外取元素的时候只能先取最上方的元素。因此栈也叫做先进后出表(FILO)或者后进先出表(LOFI)。
栈有两种,一种是顺序栈,一种是链式栈。如下图所示:
顺序栈用数组实现,链式栈使用链表实现。
对于顺序栈,我们是从数组的尾部进行插入与删除,以数组尾部作为栈顶。
对于链式栈,我们是从链表的表头进行插入与删除,以链表表头作为栈顶。
下面是顺序栈的C语言实现:
C语言实现顺序栈
结构体的定义:
struct Stack{
int *data; //用指针动态分配内存
int capacity; //容量
int top; //栈顶元素
};
栈的初始化,对于top初始化有两种选择
top=0 表示top始终指向最高元素之上的空格 因此栈满时下标是0~capacity-1 。
top=-1 表示top始终指向最高元素 。
void init(struct Stack *ps,int capacity){ //初始化栈
ps->capacity = capacity;
ps->data = (int *)malloc(sizeof(capacity));
ps->top = 0; //初始化可以为 0 or -1 .这里初始化的不同会导致后面判断栈空和栈满的不同
}
判断栈是否已满
int isFull (const struct Stack *ps){ //判断栈是否已满
return ps->top == ps->capacity;
}
判断栈是否非空
int isEmpty(const struct Stack *ps){ //判断栈是否为空
return ps->top == 0;
}
压栈操作,x表示压入的元素
int push(struct Stack *ps,int x){ //压栈
if(isFull(ps)) return 0;
else{
ps->data[ps->top] = x;
ps->top++;
return 1; //压栈成功
}
}
弹栈操作,并将弹出的元素返回
int pop(struct Stack *ps,int *px){ //弹栈,并将栈顶元素返回给*px
if(isEmpty(ps)) return 0;
else{
ps->top--;
*px = ps->data[ps->top];
return 1; //弹栈成功
}
}
使用完毕,释放栈的空间
void destory(struct Stack *ps){ //好习惯,使用完栈,将分配的空间释放,以防日后需要多次使用
free(ps->data);
}
完整代码
#include<stdio.h>
#include<stdlib.h>
using namespace std;
//顺序栈
struct Stack{
int *data; //用指针动态分配内存
int capacity; //容量
int top; //栈顶元素
};
void init(struct Stack *ps,int capacity){ //初始化栈
ps->capacity = capacity;
ps->data = (int *)malloc(sizeof(capacity));
ps->top = 0; //初始化可以为 0 or -1 .这里初始化的不同会导致后面判断栈空和栈满的不同
} //top=0 表示top始终指向最高元素之上的空格 因此栈满时下标是0~capacity-1
//top=-1 表示top始终指向最高元素
int isFull (const struct Stack *ps){ //判断栈是否已满
return ps->top == ps->capacity;
}
int isEmpty(const struct Stack *ps){ //判断栈是否为空
return ps->top == 0;
}
int push(struct Stack *ps,int x){ //压栈
if(isFull(ps)) return 0;
else{
ps->data[ps->top] = x;
ps->top++;
return 1; //压栈成功
}
}
int pop(struct Stack *ps,int *px){ //弹栈,并将栈顶元素返回给*px
if(isEmpty(ps)) return 0;
else{
ps->top--;
*px = ps->data[ps->top];
return 1; //弹栈成功
}
}
void destory(struct Stack *ps){ //好习惯,使用完栈,将分配的空间释放,以防日后需要多次使用
free(ps->data);
}
int main()
{
struct Stack st;
init(&st,5);
push(&st,11);
push(&st,22);
push(&st,33);
push(&st,44);
push(&st,55);
push(&st,66);
int x;
pop(&st,&x);
printf("%d\n",x);
destory(&st);
return 0;
}