一.相关概念:
1.栈和队列是操作受限的线性表,是限定性的数据结构;
2.栈分为顺序栈和链式栈
3.栈只能在一端进行操作(插入,删除);
4.栈是限定仅在表尾进行插入或删除操作的线性表.因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头端称为栈底(bottom).
5.不含元素地空表称为空栈.
二.顺序栈的结构:
typedef struct Stack{
int* base;//指向动态内存;
int top;//栈顶指针,实际上是下标,其实就是可以放数据的下标
int stacksize;//栈的总大小
}Stack,*PStack;
三.顺序栈的实现
//初始化
static bool IsFull(PStack ps)
{
return ps->top == ps->stacksize;
}
static void Inc(PStack ps)
{
ps->stacksize *= 2;
ps->base = (int*)realloc(ps->base, ps->stacksize * sizeof(int));
assert(ps->base != NULL);
//ps->top不处理
}
//往栈中入数据(入栈操作)
bool Push(PStack ps, int val)//O(1)
{
assert(ps != NULL);
if (ps == NULL)
return false;
if (IsFull(ps))
{
Inc(ps);
}
//在表尾插入,即入栈
ps->base[ps->top++] = val;
//ps->top++;
return true;
}
//获取栈顶元素的值,但是不删除
//输出参数
bool GetTop(PStack ps,int *rtval)
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
if (IsEmpty(ps))
{
return false;
}
*rtval=ps->base[ps->top - 1];
return true;
}
//获取栈顶元素的值,但是删除
bool Pop(PStack ps,int *rtval)
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
if (IsEmpty(ps))
{
return false;
}
//*rtval = ps->base[ps->top - 1];//OK
//ps->top--;//OK
*rtval = ps->base[--ps->top];
return true;
}
//判空
bool IsEmpty(PStack ps)
{
return ps->top == 0;
}
//获取栈中有效元素的个数
int GetLength(PStack ps)
{
assert(ps != NULL);
if (ps == NULL)
return -1;
return ps->top;//top为有效数据的个数
}
//清空所有的数据
void Clear(PStack ps)
{
assert(ps != NULL);
if (ps == NULL)
return;
ps->top = 0;
}
//销毁
void Destroy(PStack ps)
{
assert(ps != NULL);
if (ps == NULL)
return;
free(ps->base);
ps->base = NULL;
ps->top = 0;
ps->stacksize = 0;
}
四.顺序栈的总结:
1.栈的特点:后进先出,后来的反而需要先服务(访问受限的线性表)
2.栈又分为顺序栈和链式栈 3.上面顺序栈是不定长的顺序栈,能自动扩容
4.栈只能在一端进行插入和删除,插入和删除的这一端称之为栈顶,另一端称之为栈底; 5.顺序栈的栈顶在尾部,因为入栈和出栈的时间复杂度为O(1)
本篇完!