隊列棧的java
A. 棧與隊列的實現(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;
}
}
B. 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允許重復
C. JAVA中隊列和棧的區別
隊列(Queue):是限定只能在表的一端進行插入和在另一端進行刪除操作的線性表;
棧(Stack):是限定只能在表的一端進行插入和刪除操作的線性表。
區別如下:
一、規則不同
1. 隊列:先進先出(First In First Out)FIFO
2. 棧:先進後出(First In Last Out )FILO
二、對插入和刪除操作的限定不同
1. 隊列:只能在表的一端進行插入,並在表的另一端進行刪除;
2. 棧:只能在表的一端插入和刪除。
三、遍歷數據速度不同
1.
隊列:基於地址指針進行遍歷,而且可以從頭部或者尾部進行遍歷,但不能同時遍歷,無需開辟空間,因為在遍歷的過程中不影響數據結構,所以遍歷速度要快;
2.
棧:只能從頂部取數據,也就是說最先進入棧底的,需要遍歷整個棧才能取出來,而且在遍歷數據的同時需要為數據開辟臨時空間,保持數據在遍歷前的一致性。
D. Java隊列入隊和堆棧出棧演算法實現
class LinkedList //定義雙項鏈表{char data;LinkedList back;LinkedList forward;}interface Access //定義從隊列和棧存取操作的介面{void put(char c);char get();}class Queue implements Access //定義隊列類{private LinkedList QHead=new LinkedList();private LinkedList QRear=QHead; //初始化隊頭和隊尾 void put(char c) //實現向隊列存數的方法{QRear.forward=new LinkedList();QRear.forward.data=c;QRear.forward.back=QRear;QRear=QRear.forward;}public char get() //實現從隊列取數的方法{if(QHead!=QRear) //如果隊列不為空則取數{QHead.forward.back=null;QHead=QHead.forward;return QHead.data;}else{System.out.println("The queue is empty! ");return '\0';}}}class Stack implements Access //定義棧類{private LinkedList bottom=new LinkedList();private LinkedList top=bottom; //初始化棧頂與斬底public void put(char c) //實現從棧中存數的方法{top.forward=new LinkedList();top.forward.data=c;top.forward.back=top;top=top.forward;}public char get() //實現從棧中取數的方法{if(top!=bottom) //如果棧不為空則取數{char ch=top.data;top.back.forward=null;top=top.back;return ch;}else{System.out.println("The stack is empty! ");return '\0';}}}public class StackQueue{public static void main(String[] args){char ch;Queue q=new Queue(); //創建一個隊列qStack s=new Stack(); //創建一個棧sq.put('x');q.put('y');q.put('z'); //向隊列q存入3個字元s.put('x');s.put('y');s.put('z'); //向棧s存入3個字元System.out.println("Queue: ");if((ch=q.get())!='\0')System.out.println(ch);if((ch=q.get())!='\0')System.out.println(ch);if((ch=q.get())!='\0')System.out.println(ch);if((ch=q.get())!='\0')System.out.println(ch);//從隊列q中取數並顯示System.out.println("Stack: ");if((ch=s.get())!='\0')System.out.println(ch);if((ch=s.get())!='\0')System.out.println(ch);if((ch=s.get())!='\0')System.out.println(ch);if((ch=s.get())!='\0')System.out.println(ch);//從棧s中取數並顯示}}引自: http://wenwen.soso.com/z/q104863.htm?ch=w.xg.ll
E. 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());
}
}
}
F. 數據結構棧與隊列的實現(java或c#)
既然是作業就自己做呀~~
G. 簡述隊列和棧的不同,以及在java語言中如何實現這兩個數據結構
隊列形似一水管左右都互通,所以先進入的數據從另一頭先出來。棧形似回一個水杯,先進去的答肯定被壓在最下面。後進去的肯定在最上面。所以先進去肯定後最後出來。後進去的肯定最先出來。理解這個。你去看相關的代碼沒問題!
H. 怎樣用2個棧實現隊列(java)
隊列來的要求是先進源先出,用兩個棧可以很容易的實現
假設其中一個棧為s1, 另一個為s2
1. 入隊:將元素放入s1中,s2始終為空
2. 出隊:
1). 首先將s1中的元素全部導入s2的棧中,清空s1,
2). 然後再將s2棧頂元素出棧,保留下來,
3). 將s2剩餘元素導入s1中,恢復數據原有順序,就可以了
至於代碼,自己想想就能寫出來
I. java隊列和堆棧的區別
棧(stack):是一個先進後出的數據結構,通常用於保存方法(函數)中的參數,局部變數.
在java中,所有基本類型和引用類型都在棧中存儲.棧中數據的生存空間一般在當前scopes內(就是由{...}括起來的區域).
堆(heap):是一個可動態申請的內存空間(其記錄空閑內存空間的鏈表由操作系統維護),C中的malloc語句所產生的內存空間就在堆中.
在java中,所有使用new xxx()構造出來的對象都在堆中存儲,當垃圾回收器檢測到某對象未被引用,則自動銷毀該對象.所以,理論上說java中對象的生存空間是沒有限制的,只要有引用類型指向它,則它就可以在任意地方被使用.
J. 如何使用java代碼實現棧和隊列
如何使用代碼實現棧和隊列
import java.util.Scanner;
import java.util.Stack;
/**
* @author Owner
*
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n= sc.nextInt();//3條測試數據數據
Stack<Character> stack = null;
while(n!=0){
//從控制台讀入一個測試字元串[]() [(])
String str = sc.next();
//如果該輸入字元串為奇數,說明不匹配
if(str.length() % 2 == 1){
System.out.println("No");
}else{
//說明字元是偶數
stack = new Stack<Character>();
//遍歷第一條測試字元串[]() [(])
for(int i=0;i<str.length();i++){
if(stack.isEmpty()){
//如果棧是空的
stack.push(str.charAt(i));
}else if(stack.peek() == '[' && str.charAt(i) == ']' || stack.peek() == '(' && str.charAt(i) == ')'){
//說明此時棧中字元不是空的,並且符合,
stack.pop();
}else{
stack.push(str.charAt(i));
}
}
if(stack.isEmpty()){
//如果棧是空的,說明<a href="https://www..com/s?wd=%E6%8B%AC%E5%8F%B7&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-" target="_blank" class="-highlight">括弧</a>匹配
System.out.println("Yes");
}else{
//說明棧不為空,<a href="https://www..com/s?wd=%E6%8B%AC%E5%8F%B7&tn=44039180_cpr&fenlei=-bIi4WUvYETgN-" target="_blank" class="-highlight">括弧</a>不匹配
System.out.println("No");
}
}
n--;
}
}
}