1.用两个栈实现队列
用一个栈作为输入栈inStack,用于appenTail,用一个栈作为输出栈outStack,用于deleteHead;每次deleteHead,若输出栈为空,则将输入栈依次pop,push到输出栈中,则输出栈中从栈顶到栈尾部就是队列从队首到队尾的元素。
class CQueue{
private:
stack<int> inStack, outStack;
void in2out(){
while(!inStack.empty()){
outStack.push(inStack.top());//将inStack栈顶元素压入OutStack
inStack.pop();//inStack元素上弹
}
}
public:
CQueue(){}
void appendTail(int value){
inStack.push(value);
}
int deleteHead(){
if(outStack.empty()){
if(inStack.empty()){
return -1;
}
in2out();
}
int value = outStack.top();
outStack.pop();
return value;
}
};
2.包含最小函数的栈
如果在a存入栈之前,已经有b,c,d,那么在a pop之前,b,c,d一定在栈中,所以在a入栈时,将栈中的最小元素m存起来,利用辅助栈与之对应。
class MinStack{
stack<int> x_stack;
stack<int> min_stack;
public:
MinStack(){
min_stack.push(INT_MAX);
}
void push(int x){
x_stack.push(x);
min_stack.push(::min(min_stack.top(), x));//min函数存放较小值
}
void pop(){
x_stack.pop();
min_stack.pop();
}
int top(){
return x_stack.top();
}
int min(){
return min_stack.top();
}
};