https://leetcode.com/problems/implement-queue-using-stacks
https://discuss.leetcode.com/topic/17974/short-o-1-amortized-c-java-ruby
X. Inefficent
https://discuss.leetcode.com/topic/28514/easy-java-solution-just-edit-push-method
Method 2 (By making deQueue operation costly)
Implement the following operations of a queue using stacks.
- push(x) -- Push element x to the back of queue.
- pop() -- Removes the element from in front of queue.
- peek() -- Get the front element.
- empty() -- Return whether the queue is empty.
- You must use only standard operations of a stack -- which means only
push to top
,peek/pop from top
,size
, andis empty
operations are valid. - Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack.
- You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue).
class MyQueue {
Stack<Integer> input = new Stack();
Stack<Integer> output = new Stack();
public void push(int x) {
input.push(x);
}
public void pop() {
peek();
output.pop();
}
public int peek() {
if (output.empty())
while (!input.empty())
output.push(input.pop());
return output.peek();
}
public boolean empty() {
return input.empty() && output.empty();
}
}
https://leetcode.com/articles/implement-queue-using-stacks/X. Inefficent
https://discuss.leetcode.com/topic/28514/easy-java-solution-just-edit-push-method
class MyQueue {
Stack<Integer> queue = new Stack<Integer>();
// Push element x to the back of queue.
public void push(int x) {
Stack<Integer> temp = new Stack<Integer>();
while(!queue.empty()){
temp.push(queue.pop());
}
queue.push(x);
while(!temp.empty()){
queue.push(temp.pop());
}
}
// Removes the element from in front of queue.
public void pop() {
queue.pop();
}
// Get the front element.
public int peek() {
return queue.peek();
}
// Return whether the queue is empty.
public boolean empty() {
return queue.empty();
}
Method 2 (By making deQueue operation costly)
In this method, in en-queue operation, the new element is entered at the top of stack1. In de-queue operation, if stack2 is empty then all the elements are moved to stack2 and finally top of stack2 is returned.
enQueue(q, x) 1) Push x to stack1 (assuming size of stacks is unlimited). deQueue(q) 1) If both stacks are empty then error. 2) If stack2 is empty While stack1 is not empty, push everything from satck1 to stack2. 3) Pop the element from stack2 and return it.Method 2 is definitely better than method 1. Method 1 moves all the elements twice in enQueue operation, while method 2 (in deQueue operation) moves the elements once and moves elements only if stack2 empty.
void
enQueue(
struct
queue *q,
int
x)
{
push(&q->stack1, x);
}
/* Function to dequeue an item from queue */
int
deQueue(
struct
queue *q)
{
int
x;
/* If both stacks are empty then error */
if
(q->stack1 == NULL && q->stack2 == NULL)
{
printf
(
"Q is empty"
);
getchar
();
exit
(0);
}
/* Move elements from satck1 to stack 2 only if
stack2 is empty */
if
(q->stack2 == NULL)
{
while
(q->stack1 != NULL)
{
x = pop(&q->stack1);
push(&q->stack2, x);
}
}
x = pop(&q->stack2);
return
x;
}
public
class
_06_MyQueue<T> {
private
Stack<T> stack1;
private
Stack<T> stack2;
public
_06_MyQueue() {
stack1 =
new
Stack<T>();
stack2 =
new
Stack<T>();
}
public
void
push(T item) {
stack1.push(item);
}
public
T pop() {
if
(stack2.size() >
0
)
return
stack2.pop();
while
(stack1.size() >
0
)
stack2.push(stack1.pop());
return
stack2.pop();
}
public
int
size() {
return
stack1.size() + stack2.size();
}
public
T peek() {
if
(stack2.size() >
0
)
return
stack2.peek();
while
(stack1.size() >
0
)
stack2.push(stack1.pop());
return
stack2.peek();
}
}
Method 1 (By making enQueue operation costly)
This method makes sure that newly entered element is always at the top of stack 1, so that deQueue operation just pops from stack1. To put the element at top of stack1, stack2 is used.
enQueue(q, x) 1) While stack1 is not empty, push everything from satck1 to stack2. 2) Push x to stack1 (assuming size of stacks is unlimited). 3) Push everything back to stack1. dnQueue(q) 1) If stack1 is empty then error 2) Pop an item from stack1 and return it
Related: Leetcode - Implement Stack using Queues
Read full article from Implement Queue using Stacks | GeeksforGeeks