一、了解棧和佇列的基本結構
1、棧定義:棧是一種只能在一端進行插入或刪除操作的線性表。允許插入和刪除的一端被稱為
棧頂(動態變化),
另一端被稱為
棧底(固定不變),棧的插入和刪除被分別稱作入棧和
出棧。特點:
先進後出
(filo)。
儲存結構:順序棧和鏈式棧。
2、佇列
定義:隊列為一種只允許在表的一端進行插入,在一端進行刪除的受限制的線性表。允許插入的一端叫做
隊尾,允許
刪除的一端叫做
隊頭,佇列的插入和刪除被分別稱作進隊和
出隊。特點:
先進先出
(fifo)。
儲存結構:順序隊和鏈隊。
二、演算法實現
演算法一:
前提已知:
#pragma once
#include #include using namespace std;
template class stack
protected:
queueq1;
queueq2;
};
【思路】
用佇列q1進行入棧與出棧操作,佇列q2只起個中轉的作用。
入棧:直接入佇列q1即可。
出棧:把q1的除最後乙個元素外全部轉移到隊q2中,然後把剛才剩下q1中的那個元素出佇列。之後把q2
中的全部元素轉移回q1中。
【圖示】
【演算法實現】
//演算法一:佇列q1專門用來儲存和push資料,q2只是pop資料時做個中轉站
void push1(const t& data)
void pop1()
else //q1為空,就在q2中入隊,q1用作中轉站
pushtmp->push(data);//有可能在q1中入隊,也有可能在q2中入隊
} void pop2()
//讓pushtmp中的最後節點(連同最後進入的節點)出佇列
pushtmp->pop();
//交換入棧和出棧指標,減少了節點移動次數
swap(pushtmp,tmp);
} }
【完整**】
#pragma once
#include #include using namespace std;
template class stack
void pop1()
else //q1為空,就在q2中入隊,q1用作中轉站
pushtmp->push(data);//有可能在q1中入隊,也有可能在q2中入隊
} void pop2()
//讓pushtmp中的最後節點(連同最後進入的節點)出佇列
pushtmp->pop();
//交換入棧和出棧指標,減少了節點移動次數
swap(pushtmp,tmp);
} }protected:
queueq1;
queueq2;
};void test()
資料結構 兩個佇列實現乙個棧
用兩個棧實現乙個佇列,這個問題與 兩個佇列實現乙個棧 原理非常的相似。只要你明白了 兩個佇列實現乙個棧 的原理,相信聰明的你,就會明白這個問題只是它的變種,所有的異或就會迎刃而解的。這裡大家可以參考我的部落格 如下 define crt secure no warnings 1 includeusi...
資料結構 兩個佇列實現乙個棧
void stackinit stack stack 初始化 void stackdestroy stack stack 銷毀 void stackprint stack stack,const char msg 列印棧 void stackpush stack stack,datatype val...
資料結構 兩個棧實現乙個佇列
棧的特性是先進後出,佇列的特性是先進先出。那麼,我們使用兩個棧,對同乙個元素進行先進後出兩次棧就形成了先進先出的順序。即乙個元素需要入棧兩次,才能被取出來。我們將put,get定義為存放元素,與取元素。使用命名為in,out的棧,in代表往佇列裡面put元素第一次入棧是進入in,out代表get元素...