Implement the following operations of a stack using queues.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- empty() -- Return whether the stack is empty.
- You must use only standard operations of a queue -- which means only
push to back
,peek/pop from front
,size
, andis empty
operations are valid. - Depending on your language, queue may not be supported natively. You may simulate a queue by using a list or deque (double-ended queue), as long as you use only standard operations of a queue.
- You may assume that all operations are valid (for example, no pop or top operations will be called on an empty stack).
Solution:
class Stack {
private:
queue<int> que1;
queue<int> que2;
void transfer(queue<int>& q1, queue<int>& q2) {
while (q1.size() != 1) {
q2.push(q1.front());
q1.pop();
}
}
public:
// Push element x onto stack.
void push(int x) {
if (que2.empty()) {
que1.push(x);
} else {
que2.push(x);
}
}
// Removes the element on top of the stack.
void pop() {
if (que1.empty()) {
transfer(que2, que1);
que2.pop();
} else {
transfer(que1, que2);
que1.pop();
}
}
// Get the top element.
int top() {
int ret;
if (que1.empty()) {
transfer(que2, que1);
ret = que2.front();
que2.pop();
que1.push(ret);
} else {
transfer(que1, que2);
ret = que1.front();
que1.pop();
que2.push(ret);
}
return ret;
}
// Return whether the stack is empty.
bool empty() {
return que1.empty() && que2.empty();
}
};
====== Another way Clean and nice =====
class Stack { public: // Push element x onto stack. void push(int x) { queue<int> tmp; while (!q.empty()) { tmp.push(q.front()); q.pop(); } q.push(x); while (!tmp.empty()) { q.push(tmp.front()); tmp.pop(); } } // Removes the element on top of the stack. void pop() { q.pop(); } // Get the top element. int top() { return q.front(); } // Return whether the stack is empty. bool empty() { return q.empty(); } private: queue<int> q; };
No comments:
Post a Comment