
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# define size 6
typedef struct Node
{
int data
struct Node *pNext
}NODE, *PNODE
struct stack
{
PNODE ptop
}
struct Queue
{
int *pBase
int front
int rear
}
void init_s(stack *)
void init_q(Queue *)
void Enqueue(Queue *, int)
void OutQpushS(Queue *, stack *)
void PopOut(stack *, Queue *)
void Out(Queue *)
int main(void)
{
stack S//建立栈S
init_s(&S)
Queue Q//建立循环队列Q init_q(&Q)
Enqueue(&Q, 1)
Enqueue(&Q, 2)
Enqueue(&Q, 3)
printf("逆置后对列中的元素是\n")
OutQpushS(&Q, &S)//出对入栈
PopOut(&S, &Q)//出栈并入队
Out(&Q)//对Q出对
return 0}
void init_s(stack *pS)
{
pS->ptop = NULL
}
void init_q(Queue *pQ)
{
pQ->pBase = (int *)malloc(sizeof(int) * size)
if (pQ->pBase == NULL)
{
printf("动态内存分配失败!")
exit(-1)
}
pQ->front = pQ->rear = 0}
void Enqueue(Queue * pQ, int val)
{
pQ->rear = (pQ->rear + 1) % size
pQ->pBase[pQ->rear] = val}
void OutQpushS(Queue *pQ, stack *pS)
{
while (pQ->front != pQ->rear)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE))
if (pNew == NULL)
{
printf("动态内存分配失败!\n")
exit(-1)
}
pQ->front = (pQ->front + 1) % size
pNew->data = pQ->pBase[pQ->front]
pNew->pNext = pS->ptop
pS->ptop = pNew
}
}
void PopOut(stack *pS, Queue *pQ)
{
while (pS->ptop != NULL)
{
pQ->rear = (pQ->rear + 1) % size
pQ->pBase[pQ->rear]= pS->ptop->data
pS->ptop = pS->ptop->pNext
}
}
void Out(Queue *pQ)
{
while (pQ->front != pQ->rear)
{
pQ->front = (pQ->front + 1) % size
printf("%d\n", pQ->pBase[pQ->front])
}
return}
队列 (queue)是一种先进先出的线性表。它只允许在表的一端进行插入,在另一端进行删除,这如同我们日常生活中的排列是一致的,最早入队的元素最早离开。
队尾 (rear)是队列中允许插入的一端, 队头 (front)是队列中允许删除的一端。
队列如同栈一样,也同样有两种存储表示,分别是顺序表示和链式表示。
和顺序栈类似,在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到对列尾的元素之外,需要设置两个指针front和rear分别指示队列头元素和尾元素的位置。
队列的顺序存储结构表示如下:
为方便C语言描述起见,约定:初始化建空队列时,front=rear=0,每当插入新元素至队尾时,“尾指针增一”,每当删除头元素时,“头指针增一”。因此,在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队尾元素的下一个位置。
循环对列 是将顺序队列变成一个环状的空间,用这种方法可以解决队列“假溢出”问题。
“假溢出” 是指队列实际可用空间没有占满,但是不能向队列中添加新的队尾元素,否则会出现溢出的现象的情况。
在循环队列中,头尾指针以及队列元素之间的关系不发生改变,只是在循环队列中头尾指针“依次循环增一”的 *** 作可用模运算实现。通过取模,头指针和尾指针就可以在顺序表空间内以头尾衔接的方式“循环”移动。
循环队列的基本 *** 作算法描述:
链队是指采用链式存储结构实现的队列。通常链队用单链表来表示,一个链队显然需要两个分别指示对头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。为了 *** 作方便,同线性表的单链表一样,为链队添加头结点,并规定头指针始终指向头结点。
链队列存储结构表示如下:
链队 *** 作即为单链表插入和删除 *** 作的特殊情况,只是需要进一步修改尾指针或头指针。
链队列的基本 *** 作算法描述:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)