栈:
限定在表尾进行插入和删除的线性表(受到限制的线性表),是一种先进后出,后进先出的数据结构
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 <stdio.h>
#include <malloc.h>
#include <assert.h>
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;
}