数据结构之顺序栈,C语言实现(详细)
栈的定义与说明
栈是线性表的一种,特点是只能在栈的一端进行插入与删除,这一端叫做栈顶。与之相对的,另外一端叫做栈底。
最先被插入的元素会被放在最下方(栈底)。而从栈中往外取元素的时候只能先取最上方的元素。因此栈也叫做先进后出表(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; }

浙公网安备 33010602011771号