数据结构严蔚敏版精简版-栈和队列以及c语言代码实现

1栈的定义和特权

栈(stack)是限定仅在表尾进行插入或删除操作的线性表

注:虽然说栈的实现就是一端插入和删除,但不一定是在“表尾”,这个“表尾”是广义的。

头插法实现链栈

尾插法实现链栈

因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头端称为栈底(bottom)。不含元素的空表称为空栈。

2队列的定义和特权

和栈相反,队列(queue)是一种先进先出(First In First Out, FIFO)的线性表。它只允许在表 的一端进行插入,而在另一端删除元素。

如果入队序列为1,2,3,4出队序列也为1,2,3,4

队列在程序设计中也经常出现。一个最典型的 例子就是操作系统中的作业排队。在允许多道程序 运行的计算机系统中,同时有几个作业运行。如果运行的结果都需要通过通道输出,那就要按请求 输入的先后次序排队。每当通道传输完毕可以接受新的输出任务时,队头的作业先从队列中退出 做输出操作。凡是申请输出的作业都从队尾进入队列。

python实现LRU置换算法和先进先出算法

2.1循环队列

假设当前队列分配的最大空间为6,则当队列处于图d所示的状态时不可再继续 插入新的队尾元素,否则会出现溢出现象,即因数组越界而导致程序的非法操作错误。事实 上,此时队列的实际可用空间并未占满,所以这种现象称 为“假溢出"。这是由"队尾入队,队头出队”这种受限制 的操作造成的。

最常用的方式是少用一个元素空间, 即队列空间大小为m时,有m-1个元素就认为是队满。这样判断队 空的条件不变, 即当头、尾指针的值相同时,则认为队空;而当尾指针在循环意义上加1后是等 千头指针,则认为队满。因此,在循环队列中队空和队满的条件是:

队空的条件: Q.front = Q.rear

队满的条件: (Q rear+ 1)%M心CQSIZE= Q.front

入队尾指针变化:Q.front=(Q.front+1)%m

出队头指针变化:Q.front=(Q.front+1)%m

void EnQueue(Queue *Q,Elemtype x)//入队 
{
	if((Q->tail+1)%MAX_QUEUE==Q->front)
		{
		printf("已满\n");
		return;
		}
	Q->base[Q->tail]=x;
	Q->tail=(Q->tail+1)%MAX_QUEUE;
	printf("%d已经入队\n",x); 
}
void DeQueue(Queue *Q)//出队 
{	printf("%d出队\n",Q->base[Q->front]);
	Q->front=(Q->front+1)%MAX_QUEUE;
}

3栈和队列的实现c语言

3.1顺序栈的实现

#define STACK_INC_SIZE 3
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include <iostream>
#define MAX_SIZE 8

#define Elemtype char 
typedef struct stack{
	Elemtype *base;
	int top;
	int stacksize;
}Sqstack;

void Initstack(Sqstack *S)//初始化 
{
	S->base=(Elemtype*)malloc(sizeof(Elemtype)*MAX_SIZE);
	S->stacksize=8;
	S->top=0; 
 } 
 void show(Sqstack *S)//查看栈内元素 
 {
 	for(int i=S->top-1;i>=0;i--)
 	{
 		printf("%d\n",S->base[i]);
	}
 }
 bool IsFull(Sqstack *S)//判断是否满 
 {
 	return S->top>=S->stacksize; 
  } 
 bool IsEmpty(Sqstack *S)//判断是否为空栈 
 {
 	return S->top==0;
 }
 bool Inc(Sqstack *s)//栈满了则扩容,如果内存不够扩容则失败 
 {
 	Elemtype *newbase=(Elemtype*)realloc(s->base,sizeof(Elemtype)*(s->stacksize+STACK_INC_SIZE));
 	if(newbase==NULL)
 	{
 		printf("满了");
		 return false; 
	 }
	 s->base=newbase;
	 s->stacksize+=STACK_INC_SIZE;
	 return true;
 }
 
 void push(Sqstack *S,Elemtype x)//入栈 
 {
	if(IsFull(S)&&!Inc(S))
	{
		printf("满了,%d不能入栈\n",x);
		return;
	}
	S->base[S->top++]=x;
 }
 void pop(Sqstack *S)//出栈 
 {
 	if(IsEmpty(S))
 	{
 		printf("空的");
 		return;
	 }
	 S->top--;
 }
Elemtype Gettop(Sqstack *S) //获取栈顶元素 
 {
 	if(IsEmpty(S))
 	{
 		return false;
	 }
	 return S->base[S->top-1];
 }
 int length(Sqstack *S)//长度 
 {
 	return S->top;
 }
 void clear(Sqstack *S)//清空栈 
 {
 	S->top=0;
 }
 void destory(Sqstack *S)//销毁栈 
 {
 	free(S->base);
 	S->base=NULL;
 	S->stacksize=S->top==0;
 }
 
void conversion(int value)//进制转换 
{	Sqstack s;
	Initstack(&s);
	
	while(value)
	{
		push(&s,value%8);
		value=value/8;
	}
	while(!IsEmpty(&s))
{	int v;
	v=Gettop(&s);
	pop(&s);
	printf("%d",v);
	}	
}

bool Cheack(char *str)//括号匹配 
{ char v;
	Sqstack s;
	Initstack(&s);
	while(*str !='0')
	{
		if(*str=='['||*str=='(')
		{
			push(&s,*str);
		}
		else if(*str==']')
	{
		 v=Gettop(&s);
		if(v!='[')
			return false;
			pop(&s);
	}
	else if(*str==')')
	{
		 v=Gettop(&s);
		if(v!='(')
			return false;
			pop(&s);
	}
	++str;
	}
	return IsEmpty(&s);
}
int main(void)
{
	char *str="[())]";
	bool flag=Cheack(str);
	if(flag)
	{
		printf("OK\n");
	}
	else{
		printf("False");
	}
	
	
 } 
/*
int main()
{
	Elemtype Itim;
	Sqstack S;
	Initstack(&S);
	//conversion(13456);
	/*for(int i=1;i<=10;i++)
	push(&S,i);
	show(&S);
	Itim=Gettop(&S);
	printf("%d出栈\n",Itim);
	pop(&S);
	show(&S);
	}*/

3.2队列的实现

由于队列的实现比较简单,文章的开头就给出了2种链栈的实现方式,由于循环队列一直是队列的热门考点,这里只实现循环队列。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#define Elemtype int
#define MAX_QUEUE 8//最大数量为8个 
typedef struct Queue{
	Elemtype *base;//基地址 
	int front;//队头头 
	int tail;//队尾 
}Queue;

void InitQueue(Queue *Q)//初始化队列 
{
	Q->base=(Elemtype*)malloc(sizeof(Elemtype)*MAX_QUEUE);
	Q->front=Q->tail=0;
}

void EnQueue(Queue *Q,Elemtype x)//入队 
{
	if((Q->tail+1)%MAX_QUEUE==Q->front)
		{
		printf("已满\n");
		return;
		}
	Q->base[Q->tail]=x;
	Q->tail=(Q->tail+1)%MAX_QUEUE;
	printf("%d已经入队\n",x); 
}

void show(Queue *Q)//展示队列 
{
	for(int i=Q->front;i!=Q->tail;)
	{
	
	printf("%d  ",Q->base[i]);
	i=(i+1)%MAX_QUEUE;
	}
	
	printf("\n");
}
void DeQueue(Queue *Q)//出队 
{	printf("%d出队\n",Q->base[Q->front]);
	Q->front=(Q->front+1)%MAX_QUEUE;
}
int lenQueue(Queue *Q) 
{
	return (Q->tail-Q->front);
}
void Gethead(Queue *Q,Elemtype *x)//获取对头元素 
{
if(Q->front==Q->tail)
	return;
	
	*x=Q->base[Q->front];
}
void ClearQueue(Queue *Q)//清空 
{
	Q->front=Q->tail=0;
}
void DestroyQueue(Queue *Q)//销毁 
{
	ClearQueue(Q);
	free(Q->base);
	Q->base=NULL;
}

int main()
{	int x;
	Queue Q;
	InitQueue(&Q);
	EnQueue(&Q,1);
	EnQueue(&Q,2);
	EnQueue(&Q,3);
	EnQueue(&Q,4);
	DeQueue(&Q);
	show(&Q);
	printf("队列长%d\n",lenQueue(&Q));
	Gethead(&Q,&x);
	printf("队头元素为%d\n",x);
}

数据结构》(C语言)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。学了数据结构后,许多以前写起来很繁杂的代码现在写起来很清晰明了. 本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找排序的各种实现方法及其综合分析比较。 全书采用类C语言作为数据结构算法的描述语言。 本书概念表述谨,逻辑推理密,语言精炼,用词达意,并有配套出的《数据结构题集》(C语言),便于教学,又便于自学。 本书后附有光盘。光盘内容可在DOS环境下运行的以类C语言描述的“数据结构算法动态模拟辅助教学软件,以及在Windows环境下运行的以类PASCAL或类C两种语言描述的“数据结构算法动态模拟辅助教学软件”。内附 数据结构算法实现严蔚敏配套实现程序) 目录: 第1章 绪论 1.1 什么是数据结构 1.2 基本概念术语 1.3 抽象数据类型的表现实现 1.4 算法算法分析 第2章 线性表 2.1 线性表的类型定义 2.2 线性表的顺序表示实现 2.3 线性表的链式表示实现 2.4 一元多项式的表示及相加 第3章 队列 3.1 3.2 的应有举例 3.3 递归的实现 3.4 队列 3.5 离散事件模拟 第4章 串 4.1 串类型的定义 4.2 串的表示实现 4.3 串的模式匹配算法 4.4 串操作应用举例 第5章 数组广义表 5.1 数组的定义 5.2 数组的顺序表现实现 5.3 矩阵的压缩存储 5.4 广义表的定义 5.5 广义表的储存结构 5.6 m元多项式的表示 5.7 广义表的递归算法第6章 树二叉树 6.1 树的定义基本术语 6.2 二叉树 6.2.1 二叉树的定义 6.2.2 二叉树的性质 6.2.3 二叉树的存储结构 6.3 遍历二叉树线索二叉树 6.3.1 遍历二叉树 6.3.2 线索二叉树 6.4 树森林 6.4.1 树的存储结构 6.4.2 森林二叉树的转换 6.4.3 树森林的遍历 6.5 树等价问题 6.6 赫夫曼树及其应用 6.6.1 最优二叉树(赫夫曼树) 6.6.2 赫夫曼编码 6.7 回溯法树的遍历 6.8 树的计数 第7章 图 7.1 图的定义术语 7.2 图的存储结构 7.2.1 数组表示法 7.2.2 邻接表 7.2.3 十字链表 7.2.4 邻接多重表 7.3 图的遍历 7.3.1 深度优先搜索 7.3.2 广度优先搜索 7.4 图的连通性问题 7.4.1 无向图的连通分量生成树 7.4.2 有向图的强连通分量 7.4.3 最小生成树 7.4.4 关节点重连通分量 7.5 有向无环图及其应用 7.5.1 拓扑排序 7.5.2 关键路径 7.6 最短路径 7.6.1 从某个源点到其余各顶点的最短路径 7.6.2 每一对顶点之间的最短路径 第8章 动态存储管理 8.1 概述 8.2 可利用空间表及分配方法 8.3 边界标识法 8.3.1 可利用空间表的结构 8.3.2 分配算法 8.3.3 回收算法 8.4 伙伴系统 8.4.1 可利用空间表的结构 8.4.2 分配算法 8.4.3 回收算法 8.5 无用单元收集 8.6 存储紧缩 第9章 查找 9.1 静态查找表 9.1.1 顺序表的查找 9.1.2 有序表的查找 9.1.3 静态树表的查找 9.1.4 索引顺序表的查找 9.2 动态查找表 9.2.1 二叉排序树平衡二叉树 9.2.2 B树B+树 9.2.3 键树 9.3 哈希表 9.3.1 什么是哈希表 9.3.2 哈希函数的构造方法 9.3.3 处理冲突的方法 9.3.4 哈希表的查找及其分析 第10章 内部排序 10.1 概述 10.2 插入排序 10.2.1 直接插入排序 10.2.2 其他插入排序 10.2.3 希尔排序 10.3 快速排序 10.4 选择排序 10.4.1 简单选择排序 10.4.2 树形选择排序 10.4.3 堆排序 10.5 归并排序 10.6 基数排序 10.6.1 多关键字的排序 10.6.2 链式基数排序 10.7 各种内部排序方法的比较讨论 第11章 外部排序 11.1 外存信息的存取 11.2 外部排序的方法 11.3 多路平衡归并的实现 11.4 置换一选择排序 11.5 最佳归并树 第12章 文件 12.1 有关文件的基本概念 12.2 顺序文件 12.3 索引文件 12.4 ISAM文件VSAM文件 12.4.1 ISAM文件 12.4.2 VSAM文件 12.5 直接存取文件(散列文件) 12.6 多关键字文件 12.6.1 多重表文件 12.6.2 倒排文件 附录A 名词索引 附录B 函数索引 参考书目
本课件是一个动态演示数据结构算法执行过程的辅助教学软件, 它可适应读者对算法的输入数据过程执行的控制方式的不同需求, 在计算机的屏幕上显示算法执行过程中数据的逻辑结构或存储结构的变化状况或递归算法执行过程中的变化状况。整个系统使用菜单驱动方式, 每个菜单包括若干菜单项。每个菜单项对应一个动作或一个子菜单。系统一直处于选择菜单项或执行动作状态, 直到选择了退出动作为止。 本系统内含84个算法,分属13部分内容,由主菜单显示,数据结构》教科书中自第2章至第11章中相对应。各部分演示算法如下: 1. 顺序表 (1)在顺序表中插入一个数据元素(ins_sqlist) (2)删除顺序表中一个数据元素(del_sqlist) (3)合并两个有序顺序表(merge_sqlist) 2. 链表 (1)创建一个单链表(Crt_LinkList) (2)在单链表中插入一个结点(Ins_LinkList) (3)删除单链表中的一个结点(Del_LinkList) (4)两个有序链表求并(Union) (5)归并两个有序链表(MergeList_L) (6)两个有序链表求交(ListIntersection_L) (7)两个有序链表求差(SubList_L) 3. 队列 (1)计算阿克曼函数(AckMan) (2)的输出序列(Gen、Perform) (3)递归算法的演示  汉诺塔的算法(Hanoi)  解皇后问题的算法(Queen)  解迷宫的算法(Maze)  解背包问题的算法(Knap) (4)模拟银行(BankSimulation) (5)表达式求值(Exp_reduced) 4. 串的模式匹配 (1)古典算法(Index_BF) (2)求Next 函数值(Get_next)按Next 函数值进行匹配 (Index_KMP(next)) (3)求 Next 修正值(Get_nextval)按 Next 修正值进行匹配(Index_KMP(nextval)) 5. 稀疏矩阵 (1)矩阵转置 (Trans_Sparmat) (2)快速矩阵转置 (Fast_Transpos) (3)矩阵乘法 (Multiply_Sparmat) 6. 广义表 (1)求广义表的深度(Ls_Depth) (2)复制广义表(Ls_Copy) (3)创建广义表的存储结构(Crt_Lists) 7. 二叉树 (1)遍历二叉树  二叉树的线索化  先序遍历(Pre_order)  中序遍历(In_order)  后序遍历(Post_order) (2) 按先序建二叉树(CrtBT_PreOdr) (3) 线索二叉树  二叉树的线索化  生成先序线索(前驱或后继) (Pre_thre)  中序线索(前驱或后继) (In_thre)  后序线索(前驱或后继) (Post_thre)  遍历中序线索二叉树(Inorder_thlinked)  中序线索树的插入(ins_lchild_inthr)删除(del_lchild_inthr)结点 (4)建赫夫曼树求赫夫曼编码(HuffmanCoding) (5)森林转化成二叉树(Forest2BT) (6)二叉树转化成森林(BT2Forest) (7)按表达式建树(ExpTree)并求值(CalExpTreeByPostOrderTrav) 8. 图 (1)图的遍历  深度优先搜索(Travel_DFS)  广度优先搜索(Travel_BFS) (2)求有向图的强连通分量(Strong_comp) (3)有向无环图的两个算法  拓扑排序(Toposort)  关键路径(Critical_path) (4)求最小生成树  普里姆算法(Prim)  克鲁斯卡尔算法(Kruscal) (5)求关节点重连通分量(Get_artical) (6)求最短路径  弗洛伊德算法(shortpath_Floyd)  迪杰斯特拉算法(shortpath_DIJ) 9. 存储管理 (1)边界标识法 (Boundary_tag_method) (2)伙伴系统 (Buddy_system) (3)紧缩无用单元 (Storage_compaction) 10. 静态查找 (1)顺序查找(Search_Seq) (2)折半查找 (Serch_Bin) (3)插值查找 (Search_Ins) (4)斐波那契查找 (Search_Fib) (5)次优查找树(BiTree_SOSTree) 11. 动态查找 (1)在二叉排序树上进行查找(bstsrch)、插入结点(ins_bstree)删除结点(del_bstree) (2)在二叉平衡树上插入结点(ins_AVLtree) 删除结点(del_AVLtree) (3)在 B-树上插入结点(Ins_BTree) 删除结点(Del_BTree) (4)在 B+树上插入结点(Ins_PBTree) 删除结点(Del_PBTree) 12. 内部排序 (1)简单排序法  直接插入排序(Insert_sort)  表插入排序(内含插入(Ins_Tsort) 重排(Arrange)两个算法)  起泡排序(BubbleSort)  简单选择排序(SelectSort) (2)复杂排序法  堆排序(HeapSort)  快速排序(QuickSort)  锦标赛排序(Tournament) (3)其他  快速地址排序(QkAddrst)  基数排序(RadixSort) 13. 外部排序 (1)多路平衡归并排序(K-Merge) (2)置换-选择排序(Repl_Selection)
数据结构(C语言)》严蔚敏、吴伟民+课本算法源码习题解析 其中算法源码解析涵盖了《数据结构》课本习题集两部分,.所有源码实现均使用C语言,遵循C99标准,使用C-Free 5(C-Free置gcc编译器,编译时,需要在菜单栏,定位到构建-->构建选项-->类别-->C Language,勾选第三个:"ISO C99 plus GNU extensions [-std=gnu99]",即编译选项用-std=gnu99,而不是-std=c89或者-std=c99)测试通过(不要在CFree里创建工程,如果确实想在工程里运行,那文件互相引用的方式需要改写)。为了便于引用、查阅,各章内容在计算机中分文件夹存放,其中,《▲课本算法实现》中存放对课本中算法的实现,《▼配套习题解析》存放对题集中习题的解答,各源文件按章、节组织,组织方式见附录二。 《数据结构》(C语言)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。 本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找排序的各种实现方法及其综合分析比较。其内容章节编排1992年4月出的《数据结构》(第二)基本一致,但在本书中更突出了抽象数据类型的概念。全书采用类C语言作为数据结构算法的描述语言。 本书概念表述谨,逻辑推理密,语言精炼,用词达意,并有配套出的《数据结构题集》(C语言),便于教学,又便于自学。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

箫毒赵药师

嘿嘿嘿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值