基础概念
栈:一种特殊的线性表,特殊在于只能一端进行出入,先进后出(first in last out);先进去的后面出,后面进的先出;出入一端叫栈顶,另一端叫做栈底
既然是一种特殊的线性表,则有两种实现方式:顺序结构和链式结构
对栈插入数据:入栈,(压栈)
对栈删除数据:出栈(弹栈)
手枪弹夹
顺序栈:
入栈:顺序表的尾插
出栈:顺序表的尾删
唯一一点:把顺序表的结构体成员的名字换一下
base:栈底
top:顶指针
stacksize:最大容量
结构体设计
//可扩容的顺序表的结构体设计
#define STACK_INIT_SIZE 100 //初始大小
#define STACKINCREMENT 10 //不需要
typedef int ELEM_TYPE;
typedef struct Stack
{
ELEM_TYPE* base;//存储空间基址(用来接收malloc返回在堆上申请的连续空间块开始地址)
int top;//当前有效长度,且还可以表示下一个待插入位置的下标
int stacksize;//当前总空间大小(以格子个数为单位)
}Stack, * PStack;
各功能实现
初始化
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"stack.h"
void Init_stack(struct Stack* st) {
st->base = (ELEM_TYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEM_TYPE));
st->top = 0;
st->stacksize = STACK_INIT_SIZE;
}
图表分析
入栈(队尾插入)
//入栈(队尾插入)
bool Push(struct Stack* st, ELEM_TYPE val) {
assert(st != NULL);
if (Is_Full(st)) {
Inc(st);
}
st->base[st->top] = val;
st->top++;
return true;
}
出栈(队尾删除)
//出栈(队尾删除) 出栈,将值删除一个
bool Pop(struct Stack* st) {
assert(st != NULL);
if (Is_Empty(st)) {
return false;
}
st->top--;
return true;
}
获取栈顶元素值
//获取栈顶元素值 //获取栈顶的元素值,但是不删除
ELEM_TYPE Top(struct Stack* st) {
assert(st != NULL);
return st->base[st->top - 1];
}
判空
//判空
bool Is_Empty(struct Stack* st) {
assert(st != NULL);
return st->top == 0;
}
判满
//判满
bool Is_Full(struct Stack* st) {
assert(st != NULL);
return st->top == st->stacksize;
}
扩容
//扩容 *2
void Inc(struct Stack* st) {
assert(st != NULL);
ELEM_TYPE* tmp = (ELEM_TYPE*)realloc(st->base, (st->stacksize * sizeof(ELEM_TYPE)) * 2);
if (tmp == NULL)
{
printf("error\n");
return;
}
st->base = tmp;
//st->top;//扩容成功。有效长度不变
st->stacksize *= 2;
}
搜索
//搜索
int Search(struct Stack* st, ELEM_TYPE val) {
assert(st != NULL);
for (int i = 0; i < st->top; i++) {
if (st->base[i] == val) {
return i;
}
}
return -1;
}
清空
//清空
void Clear(struct Stack* st) {
st->top = 0;
}
销毁
//销毁
void Destroy(struct Stack* st) {
free(st->base);
st->top = st->stacksize = 0;
}
打印
//打印
void Show(struct Stack* st) {
assert(st != NULL);
for (int i = 0; i < st->top; i++) {
printf("%d", st->base[i]);
}
}
获取有效值个数
//获取有效值个数
int Get_length(struct Stack* st) {
assert(st != NULL);
int count = 0;
for (int i = 0; i < st->top; i++) {
count++;
}
return count;
//return st->top;
}
顺序栈的代码和Day03的顺序表差不多,大家只要注意入栈和出栈即可。如果大家有什么不懂的地方可以参考顺序表。最后记得一键三连哟。