堆栈与队列
来源:互联网 发布:一流网络空间安全学院 编辑:程序博客网 时间:2024/06/07 19:33
堆栈和队列实际上也是线性表,就是线性表的子集而已!
堆栈:
不同于内存中的堆与栈,内存中的堆与栈是两个段。而这里的堆栈是一种线型结构算法。内存中的栈这一段就是利用了堆栈后入先出的算法原理。
堆栈是一种后入先出(LIFO)的。也就是说对于堆栈的插入删除操作都是在表的同一端。
堆栈的实现方法也有顺序表和链表两种方式。
对于链表而言,链表的头结点处插入和删除都很方便,而链表的尾部插入简单,删除比较麻烦。所以对于堆栈的链表方式而言,push和pop都从头部开始比较好。
队列:
不同于堆栈的插入删除操作都是表的同一端,它的插入删除操作要在表的两端。它是一种后入后出(FIFO)结构。
同样的也有顺序表和链表两种形式。
对于顺序表而言,通常使用循环队列形式。
对于链表而言,链表头当做是队列的头,用来删除。链表尾当做队列的尾用来插入。
1.1堆栈的顺序存储
//堆栈是一种特殊的线性表,先入后出,插入和删除是在表的同一端(尾)typedef int Position;struct SNode { ElementType *Data; /* 存储元素的数组 */ Position Top; /* 栈顶指针 */ int MaxSize; /* 堆栈最大容量 */};typedef struct SNode *Stack; Stack CreateStack( int MaxSize ){ Stack S = (Stack)malloc(sizeof(struct SNode)); S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType)); S->Top = -1; S->MaxSize = MaxSize; return S;} bool IsFull( Stack S ){ return (S->Top == S->MaxSize-1);} bool Push( Stack S, ElementType X ){ if ( IsFull(S) ) { printf("堆栈满"); return false; } else { S->Data[++(S->Top)] = X; return true; }} bool IsEmpty( Stack S ){ return (S->Top == -1);} ElementType Pop( Stack S ){ if ( IsEmpty(S) ) { printf("堆栈空"); return ERROR; /* ERROR是ElementType的特殊值,标志错误 */ } else return ( S->Data[(S->Top)--] );}
1.2堆栈的链式存储
//堆栈是一种特殊的线性表,先入后出,插入和删除是在表的同一端(尾)//链表的头插入和删除都很方便,链表尾插入方便删除不便。//所以链表的头部当做是堆栈的尾部typedef struct SNode *PtrToSNode;struct SNode { ElementType Data; PtrToSNode Next;};typedef PtrToSNode Stack; Stack CreateStack( ) { /* 构建一个堆栈的头结点,返回该结点指针 */ Stack S; S = (Stack)malloc(sizeof(struct SNode)); S->Next = NULL; return S;} bool IsEmpty ( Stack S ){ /* 判断堆栈S是否为空,若是返回true;否则返回false */ return ( S->Next == NULL );} bool Push( Stack S, ElementType X ){ /* 将元素X压入堆栈S */ PtrToSNode TmpCell; TmpCell = (PtrToSNode)malloc(sizeof(struct SNode)); TmpCell->Data = X; TmpCell->Next = S->Next; S->Next = TmpCell; return true;} ElementType Pop( Stack S ) { /* 删除并返回堆栈S的栈顶元素 */ PtrToSNode FirstCell; ElementType TopElem; if( IsEmpty(S) ) { printf("堆栈空"); return ERROR; } else { FirstCell = S->Next; TopElem = FirstCell->Data; S->Next = FirstCell->Next; free(FirstCell); return TopElem; }}
2.1队列的顺序存储
//队列是一种特殊的线性表,先入先出,插入和删除是在表的两端//循环队列,数组的第一个位置不存数据,也就是n的数组只存n-1个数typedef int Position;struct QNode { ElementType *Data; /* 存储元素的数组 */ Position Front, Rear; /* 队列的头、尾指针 */ int MaxSize; /* 队列最大容量 */};typedef struct QNode *Queue; Queue CreateQueue( int MaxSize ){ Queue Q = (Queue)malloc(sizeof(struct QNode)); Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType)); Q->Front = Q->Rear = 0; Q->MaxSize = MaxSize; return Q;}bool IsFull( Queue Q ){ return ((Q->Rear+1)%Q->MaxSize == Q->Front);} bool AddQ( Queue Q, ElementType X ){ if ( IsFull(Q) ) { printf("队列满"); return false; } else { Q->Rear = (Q->Rear+1)%Q->MaxSize; Q->Data[Q->Rear] = X; return true; }} bool IsEmpty( Queue Q ){ return (Q->Front == Q->Rear);} ElementType DeleteQ( Queue Q ){ if ( IsEmpty(Q) ) { printf("队列空"); return ERROR; } else { Q->Front =(Q->Front+1)%Q->MaxSize; return Q->Data[Q->Front]; }}
2.2队列的链式存储
//队列是一种特殊的线性表,先入先出,插入和删除是在表的两端//删除是在队列的头删除,插入是在队列的尾插入//链表的头插入和删除都很方便,链表尾插入方便删除不便。//所以队列的头对应链表头,队列尾对应链表的尾typedef struct Node *PtrToNode;struct Node { /* 队列中的结点 */ ElementType Data; PtrToNode Next;};typedef PtrToNode Position; struct QNode { Position Front, Rear; /* 队列的头、尾指针 */ int MaxSize; /* 队列最大容量 */};typedef struct QNode *Queue; bool IsEmpty( Queue Q ){ return ( Q->Front == NULL);} ElementType DeleteQ( Queue Q ){ Position FrontCell; ElementType FrontElem; if ( IsEmpty(Q) ) { printf("队列空"); return ERROR; } else { FrontCell = Q->Front; if ( Q->Front == Q->Rear ) /* 若队列只有一个元素 */ Q->Front = Q->Rear = NULL; /* 删除后队列置为空 */ else Q->Front = Q->Front->Next; FrontElem = FrontCell->Data; free( FrontCell ); /* 释放被删除结点空间 */ return FrontElem; }}
阅读全文
1 0
- 堆栈与队列
- 堆栈与队列模拟
- 堆栈与队列
- java堆栈与队列
- python 堆栈与队列
- 堆栈与队列
- 堆栈与队列
- 队列与堆栈
- 堆栈与队列
- 堆栈与队列
- java队列与堆栈
- 链队列与堆栈操作
- java中的队列与堆栈
- 数据结构之堆栈与队列
- 堆栈与队列的区别
- C# 堆栈与队列的小测试
- STL通用容器之 队列与堆栈
- “数组、堆栈”与“链表、队列”的区别
- 2742 Review Template and Stack (eden)
- unity简单自由漫游摄像机控制脚本
- JS的预解析和作用域浅析
- Android中的属性,是怎么应用到控件上的(二)
- BZOJ 1066: [SCOI2007]蜥蜴 最大流
- 堆栈与队列
- C语言学习笔记——指针
- C#动态链接库的创建及使用
- Matlab批量读取文件夹文件
- Unity3d学习笔记 SendMessage
- Struts2 Web 资源获取的四种方式
- 《一》安装 TP5
- CF793B:B Igor and his way to work(DFS & BFS)
- Web基础之Request对象和Response对象项目实战