題目:用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數appendTail 和deleteHead,分別完成在隊列尾部插入結點和在隊列頭部刪除結點的功能。
思路:用兩個棧實現隊列,需要兩個棧Stack1和Stack2,push的時候直接push進Stack1。pop需要判斷Stack1和Stack2中元素的情況,Stack1空的話,直接從Stack2
pop,Stack1不空的話,把Stack1的元素push進入Stack2,然後pop Stack2的值。
Java版本:
import java.util.Stack;
public class Test {
// <>指定泛型參數,java泛型參數只是使用一個大寫字母來定義
// T 應填入一個類型,例如String。
// 注意:類型參數只能代表引用型類型,不能是原始類型(像int,double,char的等)。
// java的數據類型分基本數據類型(原始數據類型)和引用數據類型
// 定義一個隊列,隊列裏元素是T類型的。裏面包含兩個棧,插入棧和彈出棧
public static class Queue<T>{
//插入棧,只用於插入的數據
private Stack<T> stack1 =new Stack<>();
//彈出棧,只用於彈出數據
private Stack<T> stack2 =new Stack<>();
public Queue(){}
public void appendTail(T t){
stack1.add(t);
}
public T deleteHead(){
// 先判斷彈出棧是否爲空,如果爲空就將插入棧的所有數據彈出棧
// 並且將彈出的數據壓入彈出棧中
if(stack2.size()<=0){
while(stack1.size()>0)
{
stack2.add(stack1.pop());
}
}
// 如果彈出棧中沒有數據就拋出異常
if(stack2.size() == 0)
throw new RuntimeException("No more element.");
// 返回彈出棧的棧頂元素,對應的就是隊首元素。
return stack2.pop();
}
}
public static void main(String[] args) {
Queue<String> queue=new Queue<String>();
queue.appendTail("abcd");
queue.appendTail("你是誰?");
queue.appendTail("123");
queue.appendTail("+-");
System.out.println(queue.deleteHead());
System.out.println(queue.deleteHead());
System.out.println(queue.deleteHead());
System.out.println(queue.deleteHead());
}
}
Python版本:
# -*- coding:utf-8 -*-
class Queue():
def __init__(self):
self.stack1 = []
self.stack2 = []
def appendTail(self,t):
self.stack1.append(t)
def deleteHead(self):
if(len(self.stack2) <= 0):
while(len(self.stack1) > 0):
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
queue = Queue()
queue.appendTail("abcd")
queue.appendTail("你是誰?")
queue.appendTail("123")
queue.appendTail("+-")
print(queue.deleteHead())
print(queue.deleteHead())
print(queue.deleteHead())
print(queue.deleteHead())