数据结构:栈和队列(1)–顺序栈,链栈
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
在学习了数据结构的表之后了解栈和队列又是十分必要的学习路径。
一、栈和队列
1.1栈和队列的定义
栈定义:栈是限定仅在表尾进行插入和删除操作的线性表。
表的尾端称为栈顶(top),另一端称为栈底(bottom)。
** 线性表可以头删,尾删,和任意位置删除。 **
顺序表的表头删除时间复杂度0(n) 表尾 0(1)
即:表尾删除为最优解 而链表 用表头 。
依次 入栈 1234567 则 如图
出栈则如下图 后入的先出来。
栈的形象比喻为手枪弹夹,最先压入的子弹,最后发出。
栈是(last in first out)LIFO的数据结构。
1.2队列的定义
队列定义:队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是先进先出(first in first out)的数据结构。
既可以头部插入尾部删除,也可以头部删除尾部删除。
队列最好的实现方式为循环链表。
原因:指针指向尾节点则尾节点的next 则为头节点。
二、栈实现操作
2.1顺序栈的结构体定义
代码如下(示例):
//顺序栈
typedef struct Stack{
//SElemType 具体看要求进行宏定义
SElemType *base;//栈底指针 数据域,用来保存malloc申请的空间
SElemType *top;//栈顶指针
int stacksize;//最大容量,即总共申请的空间大小
}Stack,*PStack;
如果 base ==NULL,则栈为空。
2.2顺序栈的基本操作:
初始化,
void Init_stack(PStack ps);
//1.判断指针是否为空
//2.成员变量初始化
入栈(压栈 push)
bool Push(PStack ps,ELEM_TYPE val);
//1.assert
//2.空间判断 ,满了没
//3.满了扩容,没满插值
assert(ps!=NULL);
if(NULL==ps){return false;}
if(isfull(&ps)==true){inc(&ps);}
else{ ps->base[ps->top]=val;
ps->top++;
return true;
}
出栈(弹栈pop) (获取顶部数据并将其删除)
bool Pop(PStack ps,ELEM_TYPE *r);
//assert
//判空
//出栈
assert(ps!=NULL);
if(NULL==ps){return false;}
if(isempty(&ps)==true){ return false;}
*r=ps->base[--ps->top];
return true;
获取顶部元素值(top)
bool Top(PStack ps,ELEM_TYPE *r);
assert(ps!=NULL);
if(NULL==ps){return false;}
if(isempty(&ps)==true){ return false;}
*r=ps->base[ps->top-1];
return true;
获取有效个数
int Get_length(PStack ps);
//断言
return ps->top;
判空
bool isempty(PStack ps);
//assert
// if(ps->base==NUll){return true;}
//return false;
//如果栈底指针为空,这通常意味着:
//栈为空:在某些实现中,如果栈底指针指向 NULL,这可能意味着栈没有任何元素,即栈是空的。
//方法2 if(ps->top==0){return true;}
// else return false;
判满
bool isfull(PStack ps);
//assert 判断指针
//return ps->top==ps->stacksize;
扩容
static void inc(PStack ps);
//1.realloc函数扩容,大小为:元素大小*stacksize *(扩容倍数);
//2.失败则返回空
//3.成功后更改stacksize的值
清空
void clear(PStack ps);
//ps->top=0;
销毁
void Destory(PStack ps);
//ps ->top=0;
//free(ps->base);
//ps->base=NULL;
具体的main文件诸位可以按自己想法尝试。
方便展示的show函数如下
void show(PStack ps){
for(int i=0:i<ps->top;i++){
printf("%d",ps->base[i];
}
pritnf("\n");
2.3链栈的结构体定义
//链栈
typedef struct LStack{
//SElemType 具体看要求进行宏定义
SElemType *base;//栈底指针 数据域,用来保存malloc申请的空间
SElemType *top;//栈顶指针
LStack* next;
int stacksize;//最大容量,即总共申请的空间大小
}LStack,*PLStack;
2.4 链栈的基本操作
初始化
void Init_stack(PLStack ps);
//不同处 ps->next==NULL;
入栈(压栈 push)
bool Push(PLStack ps,ELEM_TYPE val);
//assert;
//单链表不判满
//申请节点 LStack pnewnode =(LStack)malloc(sizeof(LStack)*1);
//判断申请成功否
//data 赋值 然后头插
// 每次压栈后 ps->next->next=NULL;
出栈
bool Pop(PLStack ps,ELEM_TYPE *r);
//assert
//判空
// *r=ps->next->data;
//更改顶部值的next,释放顶部值的空间 ,指针置空。
获取顶部元素值(top)
bool Top(PLStack ps,ELEM_TYPE *r)
//同上 只要接受值,不要改next,不释放空间
获取有效个数
int Get_length(PLStack ps)
//int count ; for跑 count++ 直至跑完
//return count;
判空
bool isempty(PLStack ps)
//ps->next=NULL;
判满// 不存在判满
bool isfull(PLStack ps)
扩容 //不用扩容
static void inc(PLStack ps);
清空
void clear(PLStack ps)
//直接调销毁
销毁
void Destory(PLStack ps)
//一直头删
//ps->next!=NULL;
//用一个p来保证拿头下一个节点的地址,保证链表不断,直至头删完毕。
void Destory2(PLStack ps)
// while(p!=NULL)
// q=p->next;
//free§;
//p=q;
//出循环则 p->next=NULL;
注:头文件 引用·
#include<typeinfo.h>
#include<vld.h>
总结
主要讲述了栈和队列的基础该概念,并且大致给出了顺序栈和链栈实现的代码或者大致思路,希望对各位看官有所帮助。