限定在表尾进行插入和删除的线性表(受到限制的线性表),是一种先进后出,后进先出的数据结构
1 顺序栈:
和链表中的顺序表类似,不过栈是在尾部进行操作,少了头部和中间的几个函数,这里我直接实现一下代码。
stack.h
typedef int ELEM_TYPE
#define INIT_SIZE 10
sturct Stack
{
ELEM_TYPE *base; //接受malloc从堆内存申请的连续存储单元
int top; //保存有效数据长度
int stacksize;
}Stack,*PStack
初始化
void Init_Stack(PStack ps);
入栈
bool Push(PStack ps,ELEM_TYPE val);
出栈
bool Pop(PStack ps,ELEM_TYPE *rtval); //rtval是输出参数,返回出栈的值。
获取栈顶元素
bool Top(PStack ps,ELEM_TYPE *rtval);
获取有效数据个数
int Get_length(PStack ps);
判空
bool IsEmpty(PStack ps);
判满
bool IsFull(PStack ps);
扩容函数 //两倍扩容
void Inc(PStack ps);
清空
void Clear(PStack ps);
销毁
void Destroy(PStack ps);
stack .cpp #include "stack.h" #inclide#include #include void Init_Stack(PStack ps) 初始化 { ps->base=(ELEM_TYPE*)malloc(INIT_SIZE * sizeof(ELEM_TYPE)); assert(ps->base!=NULL); ps->top=0; ps->stacksize=>INIT_SIZE; } bool Push(PStack ps,ELEM_TYPE val) 入栈 { assert(ps!=NULL); if(IsFull(ps)) //判满,如果满了需扩容。 { Inc(ps); } ps->base[ps->top] = val; ps->top++; return ture; } bool IsFull(PStack ps) 判满 { return ps->top==ps->stacksize; } void Inc(PStack ps) 扩容 { ps->base= (ELEM_TYPE*)realloc(ps->base,iszeof(ELEM_TYPE)*ps->stacksize*2); assery(ps->base!=NULL); ps->stacksize*=2; } bool Pop(PStack ps,ELEM_TYPE *rtval) 出栈 { if(IsEmpty(ps)) return false; *rtval=ps->pase[--ps->top]; //把出栈的值给rtval,再让有效个数减一 return ture; } bool Top(PStack ps,ELEM_TYPE *rtval) 获取栈顶元素 { if(IsEmpty(ps)) return false; *rtval =ps->base[ps->top-1]; return true; } bool IsEmpty(PStack os) 判空 { return PStack->ps==0; } void Clear(PStack ps) 清空 { ps->top=0; //只要认为里面空间的元素值都是无效值就可以 } void Destroy(PStack ps) 销毁 { free(ps->base); ps->base=NULL; }



