棧與佇列作為資料結構中順序型別的熱門型別,近年來一直是各大公司筆試面試的常考題目型別,本次合集收錄了較為常見的棧與佇列問題,偏基礎。
1. 實現乙個棧,要求實現push(出棧)、pop(入棧)、min(返回最小值)的時間
複雜度為o(1)。
我們定義棧的結構體時除了棧儲存的資料data外可以額外儲存乙個min,這個資料代表當前棧的最小資料,當插入資料時我們將當前棧頂的min與插入資料做對比,小值存入新棧頂資料的min中,這樣同時可以保證刪除資料時以及可以讀出當前棧的最小資料。
以下為實現**。
定義乙個含有min的棧
typedef struct datatype
datatype;
typedef struct stack
stack;
初始化
oid stackinit(stack* st )
列印棧void stackprint(stack st)
else }
}
插入資料void stackpush(stack* st, int x)
else
else
}st->_a[st->_size].data=x;
st->_size++;
}
刪除資料void stackpop(stack* st)
else
}
以上只實現部分基礎介面,更多介面同理不在贅述。 2.
使用兩個棧實現乙個佇列
乙個棧只用於插入資料(以下稱進入棧),乙個棧只用於出資料(以下稱釋放棧)。插入資料時將資料插入進入棧,釋放資料時,如果釋放棧沒有資料了,將進入棧的數全部壓入釋放棧即可。讀取資料時先讀取進入棧在讀取釋放棧即可。
以下為**實現
typedef struct stoq
stoq;
模擬佇列初始化void stoqinit(stoq* p)
模擬佇列插入資料void stoqinit(stoq* p)
模擬佇列刪除資料void stackpop(stoq* p)
} stackpop(p->st2);
}
以上只提供部分基礎介面
3. 使用兩個佇列實現乙個棧
乙個佇列只增加資料,乙個佇列只刪除資料,當需要刪除資料時,將進入佇列的資料全部放入釋放佇列,將釋放佇列的資料除了最後乙個資料剩餘全部返回進入佇列,再刪除釋放佇列的資料即可,遍歷時只遍歷進入佇列即可。
typedef struct qtos qtos;
初始化
void qtosinit(qtos* p)
插入資料void qtospush(qtos* p, datatype x)
刪除資料void qtospop(qtos* p)
else
queuepop(p->q1);
while (p->q2->_head != null)
}}
棧和佇列c語言版
定義 棧是限定僅在表尾進行插入和刪除操作的線性表。我們把允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 bottom 不含任何資料元素的棧稱為空棧。棧又稱為先進後出 last in first out 的線性表,簡稱lifo結構。首先他是乙個線性表,棧元素具有線性關係,即前驅後繼關係。是一種特...
棧 C語言版
棧 lifo 運算所限的線性表,限制它的插入和刪除操作僅在表的一段進行。棧頂 top 插入 刪除。另一端為棧底。n 0稱為空棧,插入新元素稱為入棧 進棧。刪除稱為出棧 退棧。特點 先進後出。基本運算 初始化棧 判斷空 入棧 出棧 讀棧頂元素。順序棧儲存結構 初始化棧 stack init 判斷空 入...
棧和佇列面試題(C語言版)
1.判斷出入棧的合法性 2.使用兩個棧實現乙個佇列 思想 1.棧1中的所有資料彈到棧2中 棧2為空棧 2.再從棧2彈出所有資料,則可出現佇列的效果 預設壓資料壓到佇列1中,從佇列2出資料 typedef struct stack stack void stackinit stack p void s...