需要实现的功能如下:
template<typename T>
class mystack {
public:
Stack();
void push(const T& data);//入栈
T pop();//出栈
T top();//返回栈顶元素
int size() const;//返回栈的大小
bool empty();//判断是否为空
private:
queue<T> q1;
queue<T> q2;//两个用于实现的队列
int count;//元素个数
};
当压入第一个元素时,两个队列都为空,随便选哪个都可以,这里我们默认为q1,当再次压入元素时,选择不为空的那个队列:
template<typename T>
void Stack<T>::push(const T& data) {
if (q1.empty() && q2.empty()) {
q1.push(data);
} else {
if (!q1.empty()) q1.push(data);
else q2.push(data);
}
count++;
}
当需要出栈时,把含有n个元素的那个队列的n-1个元素依次“挪”到空队列,弹出队尾的元素即可:
template<typename T>
T Stack<T>::pop() {
T value;
if (!empty()) {
if (q1.empty()) {
while (q2.size() >= 2) {
q1.push(q2.front());
q2.pop();
}
value = q2.front();
q2.pop();
} else {
while (q1.size() >= 2) {
q2.push(q1.front());
q1.pop();
}
value = q1.front();
q1.pop();
}
count--;
}
return value;
}
全代码:
template<typename T>
class Stack {
public:
Stack();
void push(const T& data);
T pop();
T top();
int size() const;
bool empty();
private:
queue<T> q1;
queue<T> q2;
int count;
};
template<typename T>
Stack<T>::Stack() {
count = 0;
}
template<typename T>
int Stack<T>::size() const {
return count;
}
template<typename T>
bool Stack<T>::empty() {
return count == 0;
}
template<typename T>
void Stack<T>::push(const T& data) {
if (q1.empty() && q2.empty()) {
q1.push(data);
} else {
if (!q1.empty()) q1.push(data);
else q2.push(data);
}
count++;
}
template<typename T>
T Stack<T>::top() {
if (!q1.empty()) return q1.back();
return q2.back();
}
template<typename T>
T Stack<T>::pop() {
T value;
if (!empty()) {
if (q1.empty()) {
while (q2.size() >= 2) {
q1.push(q2.front());
q2.pop();
}
value = q2.front();
q2.pop();
} else {
while (q1.size() >= 2) {
q2.push(q1.front());
q1.pop();
}
value = q1.front();
q1.pop();
}
count--;
}
return value;
}