更新時間:2022-07-01 09:26:10 來源:動力節點 瀏覽989次
可以使用兩個隊列來實現Java堆棧。讓要實現的堆棧為“s”,用于實現的隊列為“q1”和“q2”。Stack 's' 可以通過兩種方式實現:
該方法確保新進入的元素始終位于 'q1' 的前面,因此 pop 操作只是從 'q1' 出列。'q2' 用于將每個新元素放在 'q1' 的前面。
1.push(s, x)操作的步驟描述如下:
將 x 排入隊列 q2
從 q1 逐一出列并入隊到 q2。
交換 q1 和 q2 的名稱
2.pop(s)操作的功能描述如下:
從 q1 中取出一個項目并返回它。
下面是上述方法的實現:
/* Java Program to implement a stack using
two queue */
import java.util.*;
class GfG {
static class Stack {
// Two inbuilt queues
static Queue<Integer> q1 = new LinkedList<Integer>();
static Queue<Integer> q2 = new LinkedList<Integer>();
// To maintain current number of
// elements
static int curr_size;
Stack()
{
curr_size = 0;
}
static void push(int x)
{
curr_size++;
// Push x first in empty q2
q2.add(x);
// Push all the remaining
// elements in q1 to q2.
while (!q1.isEmpty()) {
q2.add(q1.peek());
q1.remove();
}
// swap the names of two queues
Queue<Integer> q = q1;
q1 = q2;
q2 = q;
}
static void pop()
{
// if no elements are there in q1
if (q1.isEmpty())
return;
q1.remove();
curr_size--;
}
static int top()
{
if (q1.isEmpty())
return -1;
return q1.peek();
}
static int size()
{
return curr_size;
}
}
// driver code
public static void main(String[] args)
{
Stack s = new Stack();
s.push(1);
s.push(2);
s.push(3);
System.out.println("current size: " + s.size());
System.out.println(s.top());
s.pop();
System.out.println(s.top());
s.pop();
System.out.println(s.top());
System.out.println("current size: " + s.size());
}
}
// This code is contributed by Prerna
輸出
當前尺寸:3
3
2
1
當前尺寸:1
在push操作中,新元素總是排隊到q1。在 pop() 操作中,如果 q2 為空,則除了最后一個元素之外的所有元素都被移動到 q2。最后最后一個元素從 q1 出列并返回。
1.push(s, x)操作:
將 x 排入隊列 q1(假設 q1 的大小是無限的)。
2.彈出操作:
除了從 q1 到 q2 的最后一個元素,一個接一個地從隊列中取出所有元素。
將q1的最后一項出隊,出隊的項就是result,存儲起來。
交換 q1 和 q2 的名稱
返回步驟 2 中存儲的項目。
/* Java Program to implement a stack
using two queue */
import java.util.*;
class Stack {
Queue<Integer> q1 = new LinkedList<>(), q2 = new LinkedList<>();
int curr_size;
public Stack()
{
curr_size = 0;
}
void remove()
{
if (q1.isEmpty())
return;
// Leave one element in q1 and
// push others in q2.
while (q1.size() != 1) {
q2.add(q1.peek());
q1.remove();
}
// Pop the only left element
// from q1
q1.remove();
curr_size--;
// swap the names of two queues
Queue<Integer> q = q1;
q1 = q2;
q2 = q;
}
void add(int x)
{
q1.add(x);
curr_size++;
}
int top()
{
if (q1.isEmpty())
return -1;
while (q1.size() != 1) {
q2.add(q1.peek());
q1.remove();
}
// last pushed element
int temp = q1.peek();
// to empty the auxiliary queue after
// last operation
q1.remove();
// push last element to q2
q2.add(temp);
// swap the two queues names
Queue<Integer> q = q1;
q1 = q2;
q2 = q;
return temp;
}
int size()
{
return curr_size;
}
// Driver code
public static void main(String[] args)
{
Stack s = new Stack();
s.add(1);
s.add(2);
s.add(3);
s.add(4);
System.out.println("current size: " + s.size());
System.out.println(s.top());
s.remove();
System.out.println(s.top());
s.remove();
System.out.println(s.top());
System.out.println("current size: " + s.size());
}
}
// This code is contributed by Princi Singh
輸出
當前尺寸:4
4
3
2
當前尺寸:2
以上就是關于“使用隊列實現堆棧”的介紹,大家如果想了解更多相關知識,不妨來關注一下動力節點的Java隊列教程,里面有更豐富的知識等著大家去學習,相信對大家會有很大幫助的。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習