C語言 棧和佇列

2021-09-24 01:23:29 字數 3681 閱讀 9679

什麼是棧,棧有什麼特性?

棧,一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素的操作.進行資料插入和刪除的一端稱為棧頂,另一端稱為棧底.插入的操作稱為入棧/進棧/壓棧,刪除操作稱為出棧,插入和刪除的操作都在棧頂.

棧中的資料遵循後進先出原則(last in first out)

用c語言實現乙個動態棧

棧結構以及主要功能

#pragma once

#include #include #include #define size 5

typedef int sdatatype;

typedef struct stack stack;

//棧的初始化

void stackinit(stack* ps);

//入棧

void stackpush(stack* ps, sdatatype data);

//出棧

void stackpop(stack* ps);

//獲取棧頂元素

sdatatype stacktop(stack* ps);

//獲取棧中元素個數

int stacksize(stack* ps);

//判斷棧是否為空

int stackempty(stack* ps);

//銷毀棧

void stackdestroy(stack* ps);

//棧空間擴容

void buyspace(stack* ps);

棧主要功能的實現:

#include "stack.h"

void stackinit(stack* ps)

ps->capaciity = 5;

ps->size = 0;

}void stackpush(stack* ps, sdatatype data)

ps->arr[ps->size] = data;

ps->size++;

}void stackpop(stack* ps)

ps->size--;

}sdatatype stacktop(stack* ps)

return ps->arr[ps->size - 1];

}int stackempty(stack* ps)

int stacksize(stack* ps)

void stackclear(stack* ps)

void stackdestroy(stack* ps)

void buyspace(stack* ps)

ps->capaciity = 2 * (ps->capaciity);

}int main()

棧和程式執行時的棧區有什麼區別?

棧區:是一塊記憶體空間,由作業系統自動分配釋放 ,存放函式的引數值,區域性變數的值等

棧:具有後進先出的資料結構

為什麼將遞迴程式轉化成迴圈時需要用到棧?

在實現函式呼叫的時候,系統底層就是用棧來儲存函式執行現場的;具體來說,每次呼叫函式時,會把當前函式的區域性變數和返回位址都壓棧儲存起來,當函式呼叫結束返回的時候,再把區域性變數從棧裡彈出來。

而遞迴的核心就是重複的函式呼叫。因此如果要變成非遞迴,就可能需要自己實現棧資料結構用來儲存一些狀態變數;這其實就是在模擬函式呼叫。

什麼是佇列,佇列有什麼特性?棧和佇列有什麼區別?

佇列:只允許在一端進行插入資料操作,在另一端進行刪除資料操作的特殊線性表,佇列具有先進先出特性fifo(first in first out)

入佇列:進行插入操作的一端稱為隊尾

出佇列:進行刪除操作的一端稱為隊頭

棧與佇列的相同點:

1.都是線性結構。

2.插入操作都是限定在表尾進行。

3.都可以通過順序結構和鏈式結構實現。、

4.插入與刪除的時間複雜度都是o(1),在空間複雜度上兩者也一樣。

5.多鏈棧和多鏈佇列的管理模式可以相同。

棧與佇列的不同點:

1.刪除資料元素的位置不同,棧的刪除操作在表尾進行,佇列的刪除操作在表頭進行。

2.應用場景不同;常見棧的應用場景包括括號問題的求解,表示式的轉換和求值,函式呼叫和遞迴實現,深度優先搜尋遍歷等;常見的佇列的應用場景包括計算機系統中各種資源的管理,訊息緩衝器的管理和廣度優先搜尋遍歷等。

3.順序棧能夠實現多棧空間共享,而順序佇列不能。

請用c語言實現乙個佇列

queue.h

#pragma once

#include #include #include typedef int qdatatype;

typedef struct qnode

qnode;

typedef struct queue

queue;

//佇列初始化

void queueinit(queue* q);

//隊尾插入元素

void queuepush(queue* q, qdatatype data);

//申請新的節點空間

qnode* buyqueuenode(qdatatype data);

//刪除隊頭元素

void queuepop(queue* q);

//檢視對頭元素

qdatatype queuefront(queue* q);

//檢視隊尾元素

qdatatype queueback(queue* q);

//檢視隊中元素個數

int queuesize(queue* q);

//檢視佇列是否為空

int queueempty(queue* q);

//銷毀佇列

void queuedestroy(queue* q);

#include "queue.h"

void queueinit(queue* q)

qnode* buyqueuenode(qdatatype data)

newnode->_data = data;

newnode->_pnext = null;

return newnode;

}void queuepush(queue* q,qdatatype data)

else

}void queuepop(queue* q)

qnode* p = q->_front;

q->_front = q->_front->_pnext;

free(p);

p = null;

if (q->_front == null)

}qdatatype queuefront(queue* q)

return q->_front->_data;

}qdatatype queueback(queue* q)

return q->_back->_data;

}int queuesize(queue* q)

int count = 1;

qnode* p = q->_front;

while(p != q->_back)

return count;

}int queueempty(queue* q)

void queuedestroy(queue* q)

}int main()

C語言 C 棧和佇列

數制轉換 將乙個非負的十進位制整數n轉換為另乙個等價的基為b的b進製數的問題,很容易通過 除b取餘法 來解決。例 將十進位制數13轉化為二進位制數。解答 按除2取餘法,得到的餘數依次是1 0 1 1,則十進位制數轉化為二進位制數為1101。分析 由於 最先得到 的餘數是轉化結果的 最低位 最後得到的...

c語言 棧和佇列的實現

前提知識 順序表優點 可以隨機訪問,cpu快取記憶體利用率高,不涉及 較少 進行插入和刪除操作,應該使用順序表 一般而言,我們使用順序表 陣列 的形式建立 棧這一資料結構。棧 stack 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一...

C語言實現棧和佇列

標頭檔案 stack.h pragma once include include include typedef int stdatatype typedef struct stack stack 初始化棧 void stackinit stack pst 入棧 void stackpush sta...