隊列棧的java
㈠ java:如何用兩個隊列實現棧
packageleetcode.test;
importjava.util.ArrayDeque;
importjava.util.Queue;
/**
*隊列實現的棧
*
*@authorAdministrator
*/
publicclassQueueStack<T>{
Queue<T>nowQue=newArrayDeque<>();
Queue<T>otherQue=newArrayDeque<>();
publicTpop(){
Tlast=null;
while(!nowQue.isEmpty()){
last=nowQue.peek();
nowQue.poll();
if(!nowQue.isEmpty()){
otherQue.offer(last);
}
}
switchQueue();
returnlast;
}
privatevoidswitchQueue(){
Queue<T>tmp=nowQue;
nowQue=otherQue;
otherQue=tmp;
}
publicbooleanpush(Tobj){
returnnowQue.offer(obj);
}
publicbooleanisEmpty(){
returnnowQue.isEmpty();
}
@Override
publicStringtoString(){
finalStringBuildersb=newStringBuilder("{"QueueStack":{");
sb.append(""nowQue":")
.append(nowQue);
sb.append(","otherQue":")
.append(otherQue);
sb.append("}}");
returnsb.toString();
}
publicstaticvoidmain(String[]args){
QueueStack<String>queueStack=newQueueStack();
queueStack.push("1");
queueStack.push("2");
queueStack.push("3");
queueStack.push("4");
while(!queueStack.isEmpty()){
System.out.println(queueStack.pop());
}
}
}
㈡ java中的隊列,棧,map和集合有什麼關系啊,和collection有什麼關系啊!各位大神解釋一
Collection:List、Set
Map:HashMap、HashTable
如何在它們之間選擇
一、Array , Arrays
Java所有「存儲及隨機訪問一連串對象」的做法,array是最有效率的一種。
1、
效率高,但容量固定且無法動態改變。
array還有一個缺點是,無法判斷其中實際存有多少元素,length只是告訴我們array的容量。
2、Java中有一個Arrays類,專門用來操作array。
arrays中擁有一組static函數,
equals():比較兩個array是否相等。array擁有相同元素個數,且所有對應元素兩兩相等。
fill():將值填入array中。
sort():用來對array進行排序。
binarySearch():在排好序的array中尋找元素。
System.array():array的復制。
二、Collection , Map
若撰寫程序時不知道究竟需要多少對象,需要在空間不足時自動擴增容量,則需要使用容器類庫,array不適用。
1、Collection 和 Map 的區別
容器內每個為之所存儲的元素個數不同。
Collection類型者,每個位置只有一個元素。
Map類型者,持有 key-value pair,像個小型資料庫。
2、各自旗下的子類關系
Collection
--List: 將以特定次序存儲元素。所以取出來的順序可能和放入順序不同。
--ArrayList / LinkedList / Vector
--Set : 不能含有重復的元素
--HashSet / TreeSet
Map
--HashMap
--HashTable
--TreeMap
3、其他特徵
* List,Set,Map將持有對象一律視為Object型別。
* Collection、List、Set、Map都是介面,不能實例化。
繼承自它們的 ArrayList, Vector, HashTable, HashMap是具象class,這些才可被實例化。
* vector容器確切知道它所持有的對象隸屬什麼型別。vector不進行邊界檢查。
三、Collections
Collections是針對集合類的一個幫助類。提供了一系列靜態方法實現對各種集合的搜索、排序、線程完全化等操作。
相當於對Array進行類似操作的類——Arrays。
如,Collections.max(Collection coll); 取coll中最大的元素。
Collections.sort(List list); 對list中元素排序
四、如何選擇?
1、容器類和Array的區別、擇取
* 容器類僅能持有對象引用(指向對象的指針),而不是將對象信息一份至數列某位置。
* 一旦將對象置入容器內,便損失了該對象的型別信息。
2、
* 在各種Lists中,最好的做法是以ArrayList作為預設選擇。當插入、刪除頻繁時,使用LinkedList();
Vector總是比ArrayList慢,所以要盡量避免使用。
* 在各種Sets中,HashSet通常優於HashTree(插入、查找)。只有當需要產生一個經過排序的序列,才用TreeSet。
HashTree存在的唯一理由:能夠維護其內元素的排序狀態。
* 在各種Maps中
HashMap用於快速查找。
* 當元素個數固定,用Array,因為Array效率是最高的。
結論:最常用的是ArrayList,HashSet,HashMap,Array。
注意:
1、Collection沒有get()方法來取得某個元素。只能通過iterator()遍歷元素。
2、Set和Collection擁有一模一樣的介面。
3、List,可以通過get()方法來一次取出一個元素。使用數字來選擇一堆對象中的一個,get(0)...。(add/get)
4、一般使用ArrayList。用LinkedList構造堆棧stack、隊列queue。
5、Map用 put(k,v) / get(k),還可以使用containsKey()/containsValue()來檢查其中是否含有某個key/value。
HashMap會利用對象的hashCode來快速找到key。
* hashing
哈希碼就是將對象的信息經過一些轉變形成一個獨一無二的int值,這個值存儲在一個array中。
我們都知道所有存儲結構中,array查找速度是最快的。所以,可以加速查找。
發生碰撞時,讓array指向多個values。即,數組每個位置上又生成一個槤表。
6、Map中元素,可以將key序列、value序列單獨抽取出來。
使用keySet()抽取key序列,將map中的所有keys生成一個Set。
使用values()抽取value序列,將map中的所有values生成一個Collection。
為什麼一個生成Set,一個生成Collection?那是因為,key總是獨一無二的,value允許重復
㈢ 棧與隊列的實現(java)
import java.util.Stack;
public class Translate {
//程序入口
public static void main(String[]args){
int n = Translate.translate(3467,8);
System.out.println("結果是:"+n);
}
public static int translate(int number, int base_num) {
//使用棧
Stack<Integer>stack = new Stack<Integer>();
while(number>0){
//壓棧
stack.push(number % base_num);
number /= base_num;
}
int n = stack.size();
int val=0;
//依次出棧並合成結果(用我們熟悉的十進製表示,所以乘以10)
for(int i=0;i<n;i++){
val=val*10+stack.pop();
}
return val;
}
}
㈣ 數據結構棧與隊列的實現(java或c#)
既然是作業就自己做呀~~
㈤ java 隊列 堆棧 怎麼用
程序=數據結構+演算法
隊列和堆棧就是一種數據結構了,其他的還有鏈表、樹等,是一種存儲數據的形式。
堆棧就是實現先進後出的數據結構,比如一端開口一端有底瓶子里,你把餅干(數據)從左端放入瓶子中,拿餅干也要從左端拿,而先放入的餅干最後才能取出。
隊列就是實現先進先出的數據結構,比如一個兩端都開口的瓶子,你把餅干從左端放入瓶子,拿餅干可以從右端拿出,先放入的餅干最先取出
㈥ JAVA中隊列和棧的區別
隊列(Queue):是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表;
棧(Stack):是限定只能在表的一端進行插入和刪除操作的線性表。
區別如下:
一、規則不同
1. 隊列:先進先出(First In First Out)FIFO
2. 棧:先進後出(First In Last Out )FILO
二、對插入和刪除操作的限定不同
1. 隊列:只能在表的一端進行插入,並在表的另一端進行刪除;
2. 棧:只能在表的一端插入和刪除。
三、遍歷數據速度不同
1.
隊列:基於地址指針進行遍歷,而且可以從頭部或者尾部進行遍歷,但不能同時遍歷,無需開辟空間,因為在遍歷的過程中不影響數據結構,所以遍歷速度要快;
2.
棧:只能從頂部取數據,也就是說最先進入棧底的,需要遍歷整個棧才能取出來,而且在遍歷數據的同時需要為數據開辟臨時空間,保持數據在遍歷前的一致性。
㈦ java隊列和堆棧的區別
棧(stack):是一個先進後出的數據結構,通常用於保存方法(函數)中的參數,局部變數.
在java中,所有基本類型和引用類型都在棧中存儲.棧中數據的生存空間一般在當前scopes內(就是由{...}括起來的區域).
堆(heap):是一個可動態申請的內存空間(其記錄空閑內存空間的鏈表由操作系統維護),C中的malloc語句所產生的內存空間就在堆中.
在java中,所有使用new xxx()構造出來的對象都在堆中存儲,當垃圾回收器檢測到某對象未被引用,則自動銷毀該對象.所以,理論上說java中對象的生存空間是沒有限制的,只要有引用類型指向它,則它就可以在任意地方被使用.
㈧ 怎樣用2個棧實現隊列(java)
隊列的要求是先進先出,用兩個棧可以很容易的實現
假設其中一個棧為s1, 另一個為s2
1. 入隊:將元素放入s1中,s2始終為空
2. 出隊:
1). 首先將s1中的元素全部導入s2的棧中,清空s1,
2). 然後再將s2棧頂元素出棧,保留下來,
3). 將s2剩餘元素導入s1中,恢復數據原有順序,就可以了
至於代碼,自己想想就能寫出來
㈨ 跪求用JAVA語言實現一個棧和一個隊列,數據元素為double型。。。具體在問題補充里
publicinterfaceMyStack<T>{
/**
*判斷棧是否為空
*/
booleanisEmpty();
/**
*清空棧
*/
voidclear();
/**
*棧的長度
*/
intlength();
/**
*數據入棧
*/
booleanpush(Tdata);
/**
*數據出棧
*/
Tpop();
}
publicclassMyArrayStack<T>implementsMyStack<T>{
privateObject[]objs=newObject[16];
privateintsize=0;
@Override
publicbooleanisEmpty(){
returnsize==0;
}
@Override
publicvoidclear(){
//將數組中的數據置為null,方便GC進行回收
for(inti=0;i<size;i++){
objs[size]=null;
}
size=0;
}
@Override
publicintlength(){
returnsize;
}
@Override
publicbooleanpush(Tdata){
//判斷是否需要進行數組擴容
if(size>=objs.length){
resize();
}
objs[size++]=data;
returntrue;
}
/**
*數組擴容
*/
privatevoidresize(){
Object[]temp=newObject[objs.length*3/2+1];
for(inti=0;i<size;i++){
temp[i]=objs[i];
objs[i]=null;
}
objs=temp;
}
@SuppressWarnings("unchecked")
@Override
publicTpop(){
if(size==0){
returnnull;
}
return(T)objs[--size];
}
@Override
publicStringtoString(){
StringBuildersb=newStringBuilder();
sb.append("MyArrayStack:[");
for(inti=0;i<size;i++){
sb.append(objs[i].toString());
if(i!=size-1){
sb.append(",");
}
}
sb.append("]");
returnsb.toString();
}
}
//棧的鏈表實現
publicclassMyLinkedStack<T>implementsMyStack<T>{
/**
*棧頂指針
*/
privateNodetop;
/**
*棧的長度
*/
privateintsize;
publicMyLinkedStack(){
top=null;
size=0;
}
@Override
publicbooleanisEmpty(){
returnsize==0;
}
@Override
publicvoidclear(){
top=null;
size=0;
}
@Override
publicintlength(){
returnsize;
}
@Override
publicbooleanpush(Tdata){
Nodenode=newNode();
node.data=data;
node.pre=top;
//改變棧頂指針
top=node;
size++;
returntrue;
}
@Override
publicTpop(){
if(top!=null){
Nodenode=top;
//改變棧頂指針
top=top.pre;
size--;
returnnode.data;
}
returnnull;
}
/**
*將數據封裝成結點
*/
privatefinalclassNode{
privateNodepre;
privateTdata;
}
}
㈩ 簡述隊列和棧的不同,以及在java語言中如何實現這兩個數據結構
隊列形似一水管左右都互通,所以先進入的數據從另一頭先出來。棧形似一個水杯,先進去的肯定被壓在最下面。後進去的肯定在最上面。所以先進去肯定後最後出來。後進去的肯定最先出來。理解這個。你去看相關的代碼沒問題!