棧的特性是先進後出,佇列的特性是先進先出。那麼,我們使用兩個棧,對同乙個元素進行先進後出兩次棧就形成了先進先出的順序。
即乙個元素需要入棧兩次,才能被取出來。
我們將put,get定義為存放元素,與取元素。
使用命名為in,out的棧,in代表往佇列裡面put元素第一次入棧是進入in,out代表get元素是從out這個棧裡取。
第一次,get時out為空,需要從in中取元素,以形成正序取。
其內部實現細節如下:
若a還沒取,c已進棧時,如何控制?很明顯這是乙個執行緒安全問題。
在out取in中的元素的時候我們需要對 in加鎖,阻止他存放新元素進去。
而對於out,我們是在out為空的時候才取in中元素所以一般不會出現執行緒安全問題。
以下是簡易版本實現:
public
class
twostackqueue
);}}public
void
put(t t)
finally
}public t get()
}finally
return out.
pop();
}else
}finally
}public
boolean
isempty()
public
intsize()
}
資料結構 兩個佇列實現乙個棧
用兩個棧實現乙個佇列,這個問題與 兩個佇列實現乙個棧 原理非常的相似。只要你明白了 兩個佇列實現乙個棧 的原理,相信聰明的你,就會明白這個問題只是它的變種,所有的異或就會迎刃而解的。這裡大家可以參考我的部落格 如下 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...
資料結構 兩個棧實現乙個佇列 面試
棧結構 先進後出,後進先出,只允許在棧尾操作。佇列 先進先出,在隊尾入隊,在隊頭出隊。要想用兩個棧實現乙個佇列,就需要使用乙個相當於中間量的結構進行佇列的入隊和出隊操作。用圖形象化為 這樣問題就從圖中得出了思路 入隊操作 把入隊元素一一存入乙個棧結構中即可。出隊操作 出隊時,先判斷另乙個棧結構中是否...