1.栈
- 定义:只能在表尾进行删除,插入等操作(受到限制的线性表),表尾具有特殊函数称为栈顶(top),表头称作栈底,不含元素的栈称为空栈。
- 特征:“先进后出“,即先入栈的元素后出栈
栈的插入操作称为入栈,也称进栈、压栈;
栈的删除操作称为出栈,也称弹栈。
2.抽象数据类型定义
2.1顺序栈
2.1.1 顺序栈结构设计
/*
一般来说会设置两个常量:STACK_INIT_SIZE(存储空间初始分配量)
STACK_INCREMENT(存储空间分配增量)
只不过我们扩容方式是,当前容量*2,所以STACK_INCREMENT没用到
*/
//顺序栈的定义:
#pragma once
#define STACK_INIT_SIZE 100
#define ERROR 0
#define OK 1
typedef bool status;
typedef int ElemType;
typedef struct Stack{
ElemType* base;//用来接收malloc从堆内申请的连续内存
int top;//栈顶指针(和书上类型有区别)
int capacity;//当前容量的总大小(以元素个数为单位)保存栈的当前可使用的最大容量。
}Stack, *PStack;
void InitStack(Pstack ps);
status Push(Pstack ps,ElemType val);
ElemType Pop(PStack ps);
ElemType Top(PStack ps);
int Size(PStack ps);
void Clear(Psatck ps);
void Destory(Pstack ps);
//打印
void Show(struct LStack *pls)
2.1.2初始化 InitStack(Pstack ps)
void InitStck(Pstack ps)
{
assert(ps!=NULL);
ps->base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType);
if(ps->base==NULL) return; //判断内存是否申请成功
ps->top=0;
ps->capcity=STACK_INIT_SIZE;
}
2.1.3入栈Push()
status Push(Pstack ps,ElemType val){
assert(ps != nullptr);
if(IsFull()) return ERROR;
ps->base[ps->top++] = val;
return OK;
}
2.1.4出栈Pop()
ElemType Pop(PStack ps){
assert(ps != nullptr);
if(IsEmpty(ps)) return ERROR;
ElemType val = ps->base[top-1];
return val;
2.1.5获取栈顶元素Top()
ElemType Top(PStack ps){
assert(ps != nullptr);
if(IsEmpty(ps)) return ERROR;
return ps->base[ps->top-1];
}
2.1.6计算栈中的元素个数size()
int size(Pstack ps)
{
assert(!ps);
return ps->top;
}
2.1.7判空操作IsEmpty()
bool IsEmpty(Pstack ps)
{
if(ps->top==0) return true;
else return false;
}
2.1.8清空栈中数据Clear()
void Clear(Pstack ps)
{
assert(!ps);
memset(ps,0,ps->capcity*sizeof(ElemType);
ps->top=0;
}
2.1.9销毁Destory()
void Destory(Pstack ps)
{
assert(!ps);
free(ps->base);
ps->base=NULL:
}
2.1.10打印Show()
void Show(Pstack ps){
assert(ps != nullptr);
int num = ps->top;
for(int i = 0;i < num;i++){
printf("%4d",ps->base[i]);
}
printf("\n");
}