【資料結構】順序佇列的實現(C語言)
阿新 • • 發佈:2018-12-10
佇列的基本概念及其描述
佇列是一種特殊的線性表,它的特殊性在於佇列的插入和刪除操作分別在表的兩端進行。
插入的那一端稱為隊尾,刪除的那一端稱為隊首。佇列的插入操作和刪除操作分別稱為進隊和出隊。
先進先出(First In First Out)
順序佇列要掌握以下操作:
1、佇列的初始化
2、判斷佇列是否為空
3、列印佇列的節點值
4、取得佇列的隊首節點值
5、佇列的插入操作(從隊尾插入)
6、佇列的刪除操作(從隊首刪除)
執行環境:Code::Blocks 17.12
下面是標頭檔案
#ifndef SEQQUEUE_H_INCLUDED #define SEQQUEUE_H_INCLUDED #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef int datatype; typedef struct { datatype a[MAXSIZE]; int front_; int rear_; }sequence_queue; //佇列(順序儲存)初始化 void init(sequence_queue *sq) { sq->front_=0; sq->rear_=0; } //判斷佇列(順序儲存)是否為空 int isempty(sequence_queue sq) { return (sq.front_==sq.rear_?1:0); //是空的話返回1 } //列印佇列的節點值 void display(sequence_queue sq) { int i; if (isempty(sq)) { printf("\n該佇列是空的!\n\n"); } else { for(i=sq.front_;i<sq.rear_;i++) { printf("%5d",sq.a[i]); } } } //取得佇列(順序儲存)的隊首節點值 datatype get(sequence_queue sq) { if(isempty(sq)) { printf("\n該佇列是空的,無法獲得隊首節點值。\n\n");exit(1); } return sq.a[sq.front_]; } //佇列(順序儲存)的插入操作 void insert_(sequence_queue *sq,datatype x) { if(sq->rear_==MAXSIZE) { printf("\n該佇列是滿的\n"); } else { sq->a[sq->rear_]=x; sq->rear_++; printf("\n插入成功!\n\n"); } } //佇列(順序儲存)的刪除操作 void del(sequence_queue *sq) { if(sq->front_==sq->rear_) { printf("\n該佇列是空的不能進行刪除操作!\n\n"); } else { sq->front_++; printf("刪除成功!\n\n"); } } void menu() { printf("\t|===================================|\t\n"); printf("\t| |\t\n"); printf("\t| 順序佇列及其實現 |\t\n"); printf("\t| |\t\n"); printf("\t|===================================|\t\n"); printf("\t|有如下選項: |\t\n"); printf("\t|===================================|\t\n"); printf("\t|【1】佇列的初始化 |\t\n"); printf("\t|【2】判斷佇列是否為空 |\t\n"); printf("\t|【3】列印佇列的節點值 |\t\n"); printf("\t|【4】取得佇列的隊首節點值 |\t\n"); printf("\t|【5】佇列的插入操作 |\t\n"); printf("\t|【6】佇列的刪除操作 |\t\n"); printf("\t|===================================|\t\n"); printf("\t|Ctrl+C結束該程式!!! |\t\n"); printf("\t|===================================|\t\n"); } #endif // SEQQUEUE_H_INCLUDED
下面是主程式
#include <stdio.h> #include "seqqueue.h" int main () { int a,i,k; sequence_queue sq; init(&sq); while(1) { menu(); printf("請輸入你的選擇:"); scanf("%d",&a); switch(a) { case 1: { init(&sq); printf("已成功初始化一個佇列!\n\n"); break; } case 2: { if(isempty(sq)) { printf("該佇列為空!\n\n"); } else { printf("該佇列不為空!\n\n"); } break; } case 3: { display(sq); printf("\n已成功列印佇列的節點值!\n\n"); break; } case 4: { printf("%d",get(sq)); break; } case 5: { printf("請輸入一個想要插入的數:"); scanf("%d",&a); insert_(&sq,a); break; } case 6: { del(&sq); break; } } } return 0; }