面试题7:用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解题思路:队列插入元素,直接插入到stack1即可。队列删除元素,若stack2为空,将stack1中的所有元素弹出并压入到stack2中,不为空则不用,再弹出stack2的top。
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.size()<=0){
while(stack1.size()>0){
int node = stack1.top();
stack1.pop();
stack2.push(node);
}
}
int res = stack2.top();
stack2.pop();
return res;
}
private:
stack<int> stack1;
stack<int> stack2;
};
举一反三:用两个队列实现栈。思路:栈的插入,直接插入到非空queue(初始时是queue1)即可。栈的删除,将非空queue的元素弹出到另一个空queue,除了最后需要弹出的元素将其弹出。
class Solution
{
public:
void push(int node) {
if(queue2.size()>0)
queue2.push(node);
else
queue1.push(node);
}
int pop() {
int res;
if(queue1.size()>=1){
while(queue1.size()>1){
int node = queue1.top();
queue1.pop();
queue2.push(node);
}
res = queue1.top();
queue1.pop();
return res;
}
if(queue2.size()>=1){
while(queue2.size()>1){
int node = queue2.top();
queue2.pop();
queue1.push(node);
}
res = queue2.top();
queue2.pop();
return res;
}
return -1;
}
private:
stack<int> queue1;
stack<int> queue2;
};
面试题21:包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
解题思路:用一个辅助栈记录min。
class Solution {
public:
void push(int value) {
m_data.push(value);
if(m_min.size()==0 || value<m_min.top())
m_min.push(value);
else
m_min.push(m_min.top());
}
void pop() {
m_data.pop();
m_min.pop();
}
int top() {
return m_data.top();
}
int min() {
return m_min.top();
}
private:
stack<int> m_data,m_min;
};
面试题22:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
解题思路:找到压栈、出栈的规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入栈,直至压入下一个需要弹出的数字为止,如果全部数字都入栈了还是没有找到下一个需要弹出的数字,那么这个序列不可能是它的弹出序列。
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
bool isPossible = false;
int len = pushV.size();
int pushIndex = 0, popIndex = 0;
stack<int> data;
while(popIndex < len){
while(data.empty() || data.top()!=popV[popIndex]){
if(pushIndex >= len)
break;
data.push(pushV[pushIndex++]);
}//此时要么pushV中的数据都已入栈,要么已经找到与popV[popIndex]相同的数
if(data.top()!=popV[popIndex])
break;
data.pop();
popIndex++;
}
if(popIndex == len && data.empty())
isPossible = true;
return isPossible;
}
};