最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言示例代碼講解棧與隊列

 更新時間:2022年05月25日 11:45:07   作者:錫蘭Ceylan_  
棧和隊列,嚴(yán)格意義上來說,也屬于線性表,因為它們也都用于存儲邏輯關(guān)系為?"一對一"?的數(shù)據(jù),但由于它們比較特殊,本章講解分別用隊列實現(xiàn)棧與用棧實現(xiàn)隊列

上文詳細(xì)的講解了順序表與鏈表的實現(xiàn),相信大家在順序表與鏈表的指基礎(chǔ)上,很容易就能學(xué)會站和隊列,廢話不多說,我們馬上開始!

棧的定義

棧是一種線性表,但限定這種線性表只能在某一端進(jìn)行插入和刪除操作

假設(shè)棧 【s = (a1,a2,……,an) 】,a1為棧底元素,an為棧頂元素。由于棧只能在棧頂進(jìn)行插入和刪除操作,所以進(jìn)棧次序依次為【a1,a2,……,an】,出棧次序為【an,……,a2,a1】

由此可見:棧的操作特性可以明顯地概括為后進(jìn)先出

棧類似于線性表,它也有兩種對應(yīng)的存儲方式分別為順序棧和鏈棧。

順序棧

順序棧的定義

Q:什么是順序棧?

A:采用順序存儲的棧成為順序棧。它利用一組地址連續(xù)的存儲單位存放自棧底到棧頂?shù)臄?shù)據(jù)元素,同時附設(shè)一個指針(top)來指示當(dāng)前棧頂?shù)奈恢谩?/p>

棧的順序存儲類型可描述為

#define MaxSize 100				//定義棧中元素的最大個數(shù)
typedef struct
{
	SElemtype *base;			//棧底指針
	SElemtype *top;				//棧頂指針 
	int stacksize				//??捎玫淖畲笕萘?
}SqStack; 

順序棧的初始化

Q:什么是順序棧的初始化?

A:順序棧的初始化操作就是為順序棧動態(tài)分配一個最大容量為 MaxSize 的數(shù)組空間。

實現(xiàn)原理

  1. 為順序棧動態(tài)分配一個最大容量為MAXSIZE的數(shù)組
  2. 棧頂指針top初始為base,表示棧為空
  3. stacksize置為棧的最大容量MaxSize

?? 代碼演示

Status InitStack(SqStack &S)
{//構(gòu)造一個空棧S
	S. base=new SElemType[MaxSize];		//為順序棧動態(tài)分配一個最大容量為MAxsini
	if(!S. base) exit(OVERFLOW);		//存儲分配失敗
	S. top=S. base;						//top初始為base,空棧
	S. stacksize=MaxSize;				//stacksize置為棧的最大容量MaxSize
	return OK;
}

順序棧的入棧

Q:什么是順序棧的入棧?

A:入棧操作是將新元素進(jìn)入棧

??實現(xiàn)原理

  1. 判斷棧是否滿了,若滿了返回ERROR
  2. 將新元素壓入棧,棧頂指針加1

?? 代碼演示

Status Push(SqStack	&S,SElemType e)
{//插入元素e為新的棧頂元素
	if(S.top-S.base==S:stacksize) return ERROR;//棧滿 
	*S. top++=e;							   //元素e壓入棧頂,棧頂指針加1
	return OK;
}

順序棧的出棧

Q:什么是順序棧的出棧?

A:出棧操作是將棧頂元素刪除

??實現(xiàn)原理

  1. 判斷棧是否空,若空則返回ERROR
  2. 棧頂指針減1,棧頂元素出棧

?? 代碼演示

Status Pop(SqStack &S,SElemType &e)
(//刪除S的棧頂元素,用e返回其值
	if(S.top==S.base) return ERROR;//棧頂
	指針減1,將棧頂元素賦給e	   //棧頂指針減1,將棧頂元素賦給e 
	e=*--S.top;
	return OK;
)

取順序棧的棧頂元素

Q:如何取順序棧的棧頂元素?

A:當(dāng)棧非空時,此操作返回當(dāng)前棧頂元素的值,棧頂指針保持不變。

??實現(xiàn)原理

  1. 判斷棧是否空
  2. 返回棧頂元素的值,棧頂指針不變

?? 代碼演示

SElemType GetTop (SqStack S)
{//返回s的棧頂元素,不修改棧頂指針
	if(S.top!=S.base) 		        //棧非空
	    return*(S.top-1);			//返回棧頂元素的值,棧頂指針不變
)

鏈棧

采用鏈?zhǔn)酱鎯Φ臈7Q為鏈棧。鏈棧的優(yōu)點(diǎn)是便于多個棧共享存儲空間和提高其效率,且不存在棧滿上溢的情況。通常采用單鏈表實現(xiàn)。

棧的順序存儲類型可描述為

typedef struct Linknode
{
	ElemType data;				//數(shù)據(jù)域
	struct Linknode *next;		//指針域
} *LiStack; 

采用鏈?zhǔn)酱鎯?,便于結(jié)點(diǎn)的插入與刪除。鏈棧的操作與鏈表類似,入棧和出棧的操作都在鏈表的表頭進(jìn)行。

隊列

隊列的定義

隊列是一種線性表,但限定這種線性表只能在表的一端進(jìn)行插入,在另一端進(jìn)行刪除。允許刪除的一端為隊頭,又稱為隊首,允許插入的一端為隊尾

隊列與生活中的排隊一樣,最早排隊的最先離開,隊列的操作特性可以明顯地概括為先進(jìn)先出

隊列有兩種存儲表示,分別為順序表示與鏈?zhǔn)奖硎?/p>

隊列的順序表達(dá)與實現(xiàn)

隊列順序存儲結(jié)構(gòu)

和順序棧相類似,在隊列的順序存儲結(jié)構(gòu)中,除了用一組地址連續(xù)的存儲單元依次列頭到隊列尾的元素之外。還需附設(shè)兩個整型變量【front】和【rear】分別指示隊列頭元素及隊間的位置(后面分別稱為頭指針和尾指針)。

隊列的順序存儲結(jié)構(gòu)表示如下:

#define   MAXSIZE    100		//隊列容量
typedef   struct 
{   
	ElemType *base;             //存儲空間
	int front,rear;            	//隊首,隊尾
}SqQueue ;

假溢出

?

圖(1)所示為隊列的初始狀況。此時有【front == rear == 0】 成立。該條件可以作為隊列判空的條件。

但是【rear == MAXSIZE】不能作為隊列滿的條件。為什么呢?

圖(4)隊列中只有一個元素,仍滿足該條件。這時入隊出現(xiàn)上溢出。但是這種溢出并不是真正的溢出,在隊列中依然存在可以存放元素的空位置,所以是一種假溢出。

如何解決循環(huán)鏈表的這一缺點(diǎn)呢? ?

循環(huán)隊列

Q:什么是循環(huán)隊列?

A:將順序隊列臆造成一個環(huán)狀的空間,即把存儲隊列元素的表從邏輯上視為一個環(huán),稱為循環(huán)隊列。

循環(huán)隊列的初始化

Q:什么是循環(huán)隊列的初始化?

A:循環(huán)隊列的初始化就是動態(tài)分配一個預(yù)定義大小為 MAXSIZE 的數(shù)組空間

??實現(xiàn)原理

  1. 為隊列動態(tài)分配一個最大容量為MAXSIZE的數(shù)組空間
  2. base指向數(shù)組空間的首地址
  3. 頭指針與尾指針置為零,表示隊列為空

?? 代碼演示

Status InitQueue ( SqQueue  &Q )
{
	Q.base=new  ElemType[MAXSIZE];
	if(!Q.base)	return OVERFLOW;
	Q.front=Q.rear=0;
	return OK;
} 

循環(huán)隊列的入隊

Q:什么是循環(huán)隊列的入隊?

A:入隊操作是指在隊尾插入一個新的元素

??實現(xiàn)原理

  1. 判斷隊列是否滿
  2. 滿了返回ERROR
  3. 將新元素插入隊尾
  4. 隊尾指針加一

?? 代碼演示

Status EnQueue(SqQueue &Q,ElemType e)
{
    if((Q.rear+1)%MAXSIZE==Q.front)	//判滿			
	    return ERROR;
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXSIZE;
	return OK;
}

循環(huán)隊列的出隊

Q:什么是循環(huán)隊列的出隊?

A:出隊操作是刪除隊頭元素

??實現(xiàn)原理

  1. 判斷隊列是否為空
  2. 為空返回ERROR
  3. 保留隊頭元素
  4. 隊頭指針加一

?? 代碼演示

Status DeQueue(SqQueue &Q, ElemType &e)
{
    if( Q.rear==Q.front )	 
		return ERROR;			//判空
	e = Q.base[Q.front];
	Q.front = (Q.front+1)%MAXSIZE;	
	return OK;
}

鏈隊列

Q:什么是鏈隊列?

A:隊列的鏈?zhǔn)奖硎痉Q為鏈隊列。它實際上是一個同時帶有隊頭指針和隊尾指針的單鏈表,頭指針指向?qū)︻^結(jié)點(diǎn),尾指針指向隊尾結(jié)點(diǎn)。

隊列的鏈?zhǔn)酱鎯θ鐖D:

隊列的鏈?zhǔn)酱鎯︻愋涂擅枋鰹椋?/p>

typedef struct Qnode
{       
	ElemType data;
    struct QNode * next;
}Qnode,*QueuePtr;                  //結(jié)點(diǎn)
typedef struct 
{ 
	QueuePtr  front;
	QueuePtr rear;
}LinkQueue;                       //鏈隊  

鏈棧的初始化

Q:什么是鏈隊列的初始化?

A:鏈棧的初始化操作就是構(gòu)建一個只有頭結(jié)點(diǎn)的空隊。

??實現(xiàn)原理

  1. 生成新結(jié)點(diǎn)作為頭結(jié)點(diǎn)
  2. 隊頭指針和隊尾指針指向該結(jié)點(diǎn)
  3. 頭指針的指針域置空

?? 代碼演示

Status InitQueue(LinkQueue &Q)
{	
	Q.front=Q.rear=new QNode;
	p->next=NULL;
	return OK;
} 

鏈棧的入隊

??實現(xiàn)原理

  1. 為入隊元素分配結(jié)點(diǎn)空間,用指針p指向
  2. 將新結(jié)點(diǎn)數(shù)據(jù)域置為e
  3. 將新結(jié)點(diǎn)插入到隊尾
  4. 修改隊尾指針為p

?? 代碼演示

Status EnQueue(LinkQueue &Q,ElemType e)
{
	p=new QNode;		//為入隊元素分配結(jié)點(diǎn)空間,用指針p指向
	p->data=e;	        //將新結(jié)點(diǎn)數(shù)據(jù)域置為e
	p->next=NULL;		
	Q.rear->next=p;     //將新結(jié)點(diǎn)插入到隊尾
	Q.rear=p;			//修改隊尾指針為p
	return OK;
}

鏈棧的出隊

??實現(xiàn)原理

  1. 判斷是否為空,為空返回ERROR
  2. 保留頭元素空間,以備釋放
  3. 修改頭指針的指針域,指向下一結(jié)點(diǎn)
  4. 判斷出隊元素是否是最后一個元素,若是,將隊尾指針重新賦值,指向頭結(jié)點(diǎn)
  5. 釋放原隊頭元素的空間

?? 代碼演示

Status DeQueue(LinkQueue &Q,ElemType &e)
{
	if(Q.front==Q.rear)			//若隊列為空,返回ERROR
		return ERROR;
	QNode *p=Q.front->next;		//保留頭元素空間,以備釋放
	Q.front->next=p->next;		//修改頭指針的指針域,指向下一結(jié)點(diǎn)
    if(Q.rear==p)				//判斷出隊元素是否是最后一個元素,若是,將隊尾指針重新賦值,指向頭結(jié)點(diǎn)
		Q.rear=Q.front; 
	delete p;					//釋放原隊頭元素的空間
	return OK;
}

到此這篇關(guān)于C語言示例代碼講解棧與隊列的文章就介紹到這了,更多相關(guān)C語言棧與隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言中字符串常用操作總結(jié)

    C語言中字符串常用操作總結(jié)

    C語言是一種非常流行的編程語言,它支持各種數(shù)據(jù)類型,包括整數(shù)、浮點(diǎn)數(shù)、字符和字符串等,本文將介紹?C語言中字符串的相關(guān)知識,包括字符串的定義、初始化、賦值等,需要的可以參考一下
    2023-05-05
  • C++類型轉(zhuǎn)換的深入總結(jié)

    C++類型轉(zhuǎn)換的深入總結(jié)

    這篇文章主要給大家介紹了關(guān)于C++類型轉(zhuǎn)換的深入總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Qt實現(xiàn)進(jìn)程界面之間的鼠標(biāo)焦點(diǎn)切換

    Qt實現(xiàn)進(jìn)程界面之間的鼠標(biāo)焦點(diǎn)切換

    這篇文章主要為大家詳細(xì)介紹了Qt實現(xiàn)進(jìn)程界面之間的鼠標(biāo)焦點(diǎn)切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C++構(gòu)造函數(shù)初始化順序詳解

    C++構(gòu)造函數(shù)初始化順序詳解

    這篇文章主要介紹了C++構(gòu)造函數(shù)初始化順序詳解,是對C++代碼的運(yùn)行機(jī)制深入探討,需要的朋友可以參考下
    2014-10-10
  • C++ AVLTree高度平衡的二叉搜索樹深入分析

    C++ AVLTree高度平衡的二叉搜索樹深入分析

    這篇文章主要介紹了C++ AVLTree高度平衡的二叉搜索樹,二叉搜索樹雖可以縮短查找的效率,但如果數(shù)據(jù)有序或接近有序二叉搜索樹將退化為單支樹,查找元素相當(dāng)于在順序表中搜索元素,效率低下
    2023-03-03
  • c語言使用fdk_aac實現(xiàn)aac音頻解碼為pcm

    c語言使用fdk_aac實現(xiàn)aac音頻解碼為pcm

    這篇文章主要為大家詳細(xì)介紹了c語言如何使用fdk_aac庫實現(xiàn)aac音頻解碼為pcm的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • C語言中的正則表達(dá)式使用示例詳解

    C語言中的正則表達(dá)式使用示例詳解

    正則表達(dá)式是使用單個字符串來描述、匹配一系列符合某個句法規(guī)則的字符串。本文通過示例代碼給大家介紹了C語言中的正則表達(dá)式使用,感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • c語言snprintf函數(shù)的用法詳解

    c語言snprintf函數(shù)的用法詳解

    這篇文章主要給大家介紹了關(guān)于c語言snprintf函數(shù)用法的相關(guān)資料,snprintf()函數(shù)用于將格式化的數(shù)據(jù)寫入字符串,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • C++深入探究哈希表如何封裝出unordered_set和unordered_map

    C++深入探究哈希表如何封裝出unordered_set和unordered_map

    哈希表是一種根據(jù)關(guān)鍵碼去尋找值的數(shù)據(jù)映射結(jié)構(gòu),該結(jié)構(gòu)通過把關(guān)鍵碼映射的位置去尋找存放值的地方,說起來可能感覺有點(diǎn)復(fù)雜,我想我舉個例子你就會明白了,最典型的的例子就是字典
    2022-06-06
  • C語言中字符串常用函數(shù)strcat與strcpy的用法介紹

    C語言中字符串常用函數(shù)strcat與strcpy的用法介紹

    以下是對C語言中字符串常用函數(shù)strcat與strcpy的使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07

最新評論

江川县| 宁武县| 富宁县| 互助| 资源县| 双流县| 西平县| 蚌埠市| 独山县| 枝江市| 洪泽县| 阿瓦提县| 沙湾县| 上思县| 塔河县| 陵川县| 峨眉山市| 富阳市| 岳普湖县| 偃师市| 和田县| 全南县| 白朗县| 凤山县| 藁城市| 廉江市| 玉田县| 利辛县| 凉山| 驻马店市| 二连浩特市| 珲春市| 乌兰察布市| 西城区| 民权县| 喜德县| 鄂托克旗| 汤阴县| 仲巴县| 温州市| 新余市|