1. 程式人生 > >資料結構學習之路4 佇列的基本操作(順序儲存的迴圈佇列+連結串列實現)

資料結構學習之路4 佇列的基本操作(順序儲存的迴圈佇列+連結串列實現)

佇列先進先出,這裡用了順序(陣列)和鏈式兩種方式實現,下次再用鏈式儲存實現以下堆疊試試

迴圈佇列:

//順序儲存結構的迴圈佇列
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef struct Qnode *Queue;
struct Qnode{
	int data[MAXSIZE];
	int front;
	int rear;
};
Queue creat(){
	Queue p;
	p = (Queue)malloc(sizeof(Qnode));
	p ->front = p ->rear = 0;
	return p;
}
int isFull(Queue p){
	if((p ->rear + 1) % MAXSIZE == p ->front)
		return 1;
	else return 0;
}
int isEmpty(Queue p){
	if(p ->front == p ->rear)
		return 1;
	else return 0;
}
void add(Queue p, int x){
	if(isFull(p)){
		cout << "佇列已滿";
		return;
	}
	else{ 
		p ->rear = (p ->rear + 1) % MAXSIZE;
		p ->data[p ->rear] = x;
		return;
	}
}
int delet(Queue p){
	if(isEmpty(p)){
		cout << "佇列已空";
		return NULL;
	}
	else{
		p ->front = (p ->front + 1)% MAXSIZE;
		return p ->data[p ->front];
	}
}
void main(){
	system("pause");
}
迴圈佇列的話應該是具有記憶性的,多次入隊之後即使全部出隊實際上陣列也是有資料的,只不過front和rear的指標在一起,這裡也要注意迴圈佇列判滿不是非要浪費一個儲存空間的,比如加一個flag的變數,入隊就置一,出隊就清零,這樣就可以通過檢查flag變數的值來得知最近的一次操作是入隊還是出隊,如果入隊的話,front = rear自然是隊滿了,而使用上面的這種方法的話,浪費了一個儲存空間,不管是front還是rear,只要變數增加就要對MAXSIZE取餘,這一點不能忘,因為這是迴圈佇列,陣列的最大下標之後不是溢位,而是回到了起始的0位置,所以必須取餘

接下來是連結串列實現:

//佇列的連結串列表現
#include<iostream>
using namespace std;
typedef struct Qnode *Queue;
typedef struct Q *q;
struct Qnode{
	int data;
	Queue next;
};
struct Q{
	Queue front;
	Queue rear;
};
q creat(){
	q p;
	p = (q)malloc(sizeof(Q));
	p ->front = p ->rear = NULL;
	return p;
}
int isEmpty(q p){
	if(p ->front == NULL)
		return 1;
	else return 0;
}
void add(int x, q p){
	if(isEmpty(p)){
		Queue n;
		n = (Queue)malloc(sizeof(Qnode));
		n ->data = x;
		n ->next = NULL;
		p ->front = p ->rear = n;
		return;
	}
	else{
		Queue s = p ->front;
		while(s ->next != NULL){
			s = s ->next;	
		}
		Queue n;
		n = (Queue)malloc(sizeof(Qnode));
		n ->data = x;
		n ->next = NULL;
		s ->next = n;
		p ->rear = n;
		return;
	}
}
int delet(q p){
	if(isEmpty(p)){
		cout << "佇列已空";
		return NULL;
	}
	else if(p ->front == p ->rear){
		Queue s;
		s = p ->front;
		int a = s ->data;
		free(s);
		p ->front = p ->rear =NULL;
		return a;
	}
	else{
		Queue s;
		s = p ->front;
		p ->front = p ->front ->next;
		int a = s ->data;
		free(s);
		return a;
	}
}
void show(q p){
	if(isEmpty(p)){
		cout << "佇列已空!";
		return;
	}
	Queue s = p ->front;
	while(s != NULL){
		cout << s ->data << endl;
		s = s ->next;
	}
}
void main(){
	q p = creat();
	add(2, p);
	add(7, p);
	add(4, p);
	add(9, p);
	show(p);
	delet(p);
	show(p);
	system("pause");
}

連結串列就沒什麼說的了,個人感覺需要注意的有一點,front = rear的時候不一定就是佇列為空,也可能是隻有一個數據,只有是front = rear = NULL的時候才代表隊列為空,當然,直接寫front = NULL就代表隊列為空了

佇列個人感覺不是很難,但是這個資料結構卻很有意思,時刻記得出隊也好入隊也好都是變數增加就好了,出隊是front加一,入隊是rear加一

相關推薦

資料結構學習4 佇列基本操作順序儲存迴圈佇列+連結串列實現

佇列先進先出,這裡用了順序(陣列)和鏈式兩種方式實現,下次再用鏈式儲存實現以下堆疊試試 迴圈佇列: //順序儲存結構的迴圈佇列 #include<iostream> using namespace std; #define MAXSIZE 100 typedef

資料結構學習----------線性表順序儲存結構插入和刪除節點平均移動次數

假設線性表的長度為n。 首先來說線性表順序儲存的插入問題: 線性表元素有n個,那麼插入位置有n+1個。 插入第一個位置需要移動n個,第二個需要移動n-1個,第三個需要移動n-2個。以此類推,總共移動次數為n+(n-1)+(n-2)+...+2+1+0=(n+1)*n/2。

一個菜鳥的資料結構學習棧篇

棧的基本操作如下: 相關結構體: typedef int status; typedef struct { SElemType *base; //在棧建立之前和銷燬之後,base的值為NULL SElemType *top; //棧

資料結構學習C語言對陣列的簡單實現

以下的程式只是在觀看郝斌老師講解的(C語言資料結構)之後自己做得簡單練習。# include <stdio.h> # include <stdlib.h> typedef struct MyArray{ int * pBase; //存放陣列第一個

資料結構學習——————串

1.串型別的定義 串(string)(或字串)是由零個或多個字元組成的有限序列,一般記為                                           n稱為串的長度。零個字元的串稱為空串,長度為0。串中任意個連續字元組成的子序列稱為該串的子串。包

【C#學習】001.基本操作

arp main cti 字符 thread 程序 AI 報錯 float 001【HelloWorld】分析代碼塊 //這裏是註釋 下面是引入命名空間 using System; using System.Collections.Generic; using Syst

linux學習:2.基本指令2

inux 可執行文件 選項 說明 獨立 選項說明 img color 配置 一、在線求助:man page 與info page 1.man(manual:操作說明) page 我想查看日歷,所以我輸入man cal 效果如圖: 圖中CAL(1)中,在不同的指令中數字的含

佇列分別用列表和連結串列實現

#!/usr/bin/python3 class QueueUnderflow(ValueError):     pass class ListQueue():  #列表實現迴圈佇列類     def __init__(self, len_

vue學習 - 4.基本操作

align 過去 開始 就會 binding 效果 不可 exp 功能 vue學習之路 - 4.基本操作(下) 簡述:本章節主要介紹 vue 的一些其他常用指令。 Vue 指令   這裏將 vue 的指令分為系統內部指令(vue 自帶指令)和用戶自定義指令兩種。 系統內部指

Python3學習~4.4 軟體目錄結構規範

為什麼要設計好目錄結構? 可讀性高: 不熟悉這個專案的程式碼的人,一眼就能看懂目錄結構,知道程式啟動指令碼是哪個,測試目錄在哪兒,配置檔案在哪兒等等。從而非常快速的瞭解這個專案。 可維護性高: 定義好組織規則後,維護者就能很明確地知道,新增的哪個檔案和程式碼應該放在什麼目錄之下。這個好處是,隨著時

資料結構學習佇列c++實現楊輝三角

#ifndef LINKQUEUE_H #define LINKQUEUE_H #include <iostream> #include <assert.h> using namespace std; template <class T>

python學習4

形式 nic 解碼 姓名 tro AMM 溢出 用戶 因此 一、字符編碼與轉碼 1.在python2默認編碼是ASCII, python3裏默認是utf-8 2.unicode 分為 utf-32(占4個字節),utf-16(占兩個字節),utf-8(占1-4個字節), s

MySQL學習43

資料庫的基本操作3 4.刪除資料表 4.1刪除沒有被關聯的表 DROP TABLE可以一次刪除一個或多個沒有被其他表關聯的的資料表。語法格式如下: DROP TABLE [IF EXISITS] 表1,表2,……,表n; 如果要刪除的資料表不存在,則會出現一條錯誤資訊: ERROR 10

MYSQL學習42

資料表的基本操作2 (這裡的例子有用到前面1的) 2.檢視資料表結構 2.1查看錶基本結構語句DESCRIBE DESCRIBE/DESC可以檢視欄位的資訊,其中包括:欄位名、欄位資料型別、是否為主鍵、是否有預設值等。語法規則: DESCRIBE 表名;或者簡寫為:DESC 表名; 例:

MySQL學習41

資料表的基本操作1 1. 建立資料表 所謂的建立資料表,指在已經建立好的資料庫中建立新表。 1.1建立表的語法形式 資料表屬於資料庫,所以在建立資料表之前應使用“USE <資料庫名>”,即指定當前操作在哪裡進行,如果沒有選擇資料庫,會丟擲“No database select

資料分析學習

一、大資料分析的五個基本方面  二、如何選擇適合的資料分析工具 三、如何區分三個大資料熱門職業  四、從菜鳥成為資料科學家的 9步養成方案 五、從入門到精通——快速學會大資料分析   推薦下小編的大資料學習群;

Python3學習~4.2 迭代器

可以直接作用於for迴圈的資料型別有以下幾種: 一類是集合資料型別,如list、tuple、dict、set、str等; 一類是generator,包括生成器和帶yield的generator function。 這些可以直接作用於for迴圈的物件統稱為可迭代物件:Iterable。 可以使用isin

python的學習===小白學程式設計4FOR語句學習

 最近拖延症嚴重發作學習有點斷斷續續,相應的隨筆也沒有更新,所以暫時不考慮完整性,先貼上來接續起來再說。   利用for語句就可以將不同的表名及欄位名賦值給相同的引數,複用同一個語句結構簡化程式碼。 需要的變數是介面名稱、輸入引數,輸出欄位、目標表名稱

資料結構-必經

引言 在正式學習資料結構之前,我的習慣是先對資料結構在巨集觀上有一定的瞭解,有個巨集觀的把控。 三個階段 一、學活 首先,是一個學活的過程。 對於資料結構這個過程要求我們掌握基本概念,這些基本概念總結為三大類,表、樹、圖。 掌握了概念還需要我們瞭解概念的基本操作

資料學習Hbase shell的基本操作

HBase的命令列工具,最簡單的介面,適合HBase管理使用,可以使用shell命令來查詢HBase中資料的詳細情況。安裝完HBase之後,啟動hadoop叢集(利用hdfs儲存),啟動zookeeper,使用start-hbase.sh命令開啟hbase服務,最後在shel