【資料結構】順序佇列
阿新 • • 發佈:2018-12-11
一、順序佇列的概念和分類
1、概念:順序佇列的底層結構是資料儲存元素的,用兩個整形數字來表示隊頭和隊尾的下標front和back
2、順序佇列根據出入元素方式不同分為兩種形式
二、程式碼展示
1、隊頭不動
編譯環境VS2008
Queue.h
#pragma once #include <stdio.h> #include <assert.h> #include <windows.h> #define MAX_SIZE 8 typedef int DataType; typedef struct Queue { DataType _array[MAX_SIZE]; int _front; //指向隊頭元素的下標 int _back; //指向隊尾元素的下標 }Queue; //佇列的初始化 void QueueInit(Queue * q); //佇列中插入元素 void QueuePush(Queue* q, DataType date); //佇列中刪除元素 void QueuePop(Queue* q); //檢視棧頂元素 DataType QueueTop(Queue* q); //檢視隊尾元素 DataType QueueBack(Queue* q); //檢視佇列的大小 int QueueSize(Queue* q); //判斷佇列是否為空 int QueueEmpty(Queue* q);
Queue.c
#include "Queue.h" //佇列的初始化 void QueueInit(Queue * q) { assert(q); q->_back = q->_front = 0; } //佇列中插入元素 void QueuePush(Queue* q, DataType data) { assert(q); if (q->_back == MAX_SIZE) printf("佇列元素已滿,不能插入!!!\n"); q->_array[q->_back++] = data; } //佇列中刪除元素 void QueuePop(Queue* q) { int i = 0; if (QueueEmpty(q)) printf("佇列的元素為空,不能刪除元素!!!\n"); for (i = 0; i < q->_back - 1; ++i) { q->_array[i] = q->_array[i + 1]; } q->_back--; } //檢視棧頂元素 DataType QueueTop(Queue* q) { assert(q); if (QueueEmpty(q)) printf("佇列為空!!!\n"); return q->_array[q->_front]; } //檢視隊尾元素 DataType QueueBack(Queue* q) { assert(q); if (q->_back == 0) printf("佇列為空!!!\n"); return q->_array[q->_back - 1]; } //檢視佇列的大小 int QueueSize(Queue* q) { assert(q); return q->_back; } //判斷佇列是否為空 int QueueEmpty(Queue* q) { assert(q); return 0 == q->_back; }
test.c
#include "Queue.h" void test10(); int main() { test10(); system("pause"); return 0; } void test10() { Queue q; QueueInit(&q); QueuePush(&q, 3); QueuePush(&q, 4); QueuePush(&q, 4); QueuePush(&q, 5); QueuePush(&q, 6); QueuePush(&q, 7); printf("size = %d\n", QueueSize(&q)); printf("front = %d\n", QueueTop(&q)); printf("back = %d\n", QueueBack(&q)); QueuePop(&q); QueuePop(&q); printf("size = %d\n", QueueSize(&q)); printf("front = %d\n", QueueTop(&q)); printf("back = %d\n", QueueBack(&q)); }
2、隊頭移動
Queue.h
#pragma once
#include <stdio.h>
#include <assert.h>
#include <windows.h>
#define MAX_SIZE 8
typedef int DataType;
typedef struct Queue
{
DataType _array[MAX_SIZE];
int _front; //指向隊頭元素的下標
int _back; //指向隊尾元素的下標
}Queue;
//佇列的初始化
void QueueInit(Queue * q);
//佇列中插入元素
void QueuePush(Queue* q, DataType date);
//佇列中刪除元素
void QueuePop(Queue* q);
//檢視棧頂元素
DataType QueueTop(Queue* q);
//檢視隊尾元素
DataType QueueBack(Queue* q);
//檢視佇列的大小
int QueueSize(Queue* q);
//判斷佇列是否為空
int QueueEmpty(Queue* q);
Queue.h
#include "Queue.h"
//佇列的初始化
void QueueInit(Queue * q)
{
assert(q);
q->_back = q->_front = 0;
}
//佇列中插入元素
void QueuePush(Queue* q, DataType data)
{
assert(q);
if (q->_back == MAX_SIZE)
printf("佇列元素已滿,不能插入!!!\n");
q->_array[q->_back++] = data;
}
//佇列中刪除元素
void QueuePop(Queue* q)
{
int i = 0;
if (QueueEmpty(q))
printf("佇列的元素為空,不能刪除元素!!!\n");
q->_front++;
}
//檢視棧頂元素
DataType QueueTop(Queue* q)
{
assert(q);
if (QueueEmpty(q))
printf("佇列為空!!!\n");
return q->_array[q->_front];
}
//檢視隊尾元素
DataType QueueBack(Queue* q)
{
assert(q);
if (QueueEmpty(q))
printf("佇列為空!!!\n");
return q->_array[q->_back - 1];
}
//檢視佇列的大小
int QueueSize(Queue* q)
{
assert(q);
return q->_back-q->_front;
}
//判斷佇列是否為空
int QueueEmpty(Queue* q)
{
assert(q);
return q->_front == q->_back;
}
test.c
#include "Queue.h"
void test10();
int main()
{
test10();
system("pause");
return 0;
}
void test10()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 4);
QueuePush(&q, 5);
QueuePush(&q, 6);
QueuePush(&q, 7);
printf("size = %d\n", QueueSize(&q));
printf("front = %d\n", QueueTop(&q));
printf("back = %d\n", QueueBack(&q));
QueuePop(&q);
QueuePop(&q);
printf("size = %d\n", QueueSize(&q));
printf("front = %d\n", QueueTop(&q));
printf("back = %d\n", QueueBack(&q));
}