什麼是棧,棧有什麼特性?
棧,一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素的操作.進行資料插入和刪除的一端稱為棧頂,另一端稱為棧底.插入的操作稱為入棧/進棧/壓棧,刪除操作稱為出棧,插入和刪除的操作都在棧頂.
棧中的資料遵循後進先出原則(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...