1.剑指Offer 09 用栈实现队列
用两个栈实现一个队列,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
解题思路:此时建立一个A栈和B栈,把A当做一个队列,栈顶为队尾,栈底为队顶,当数据要入队时,可以直接入A栈,当要删除队首时,就需要把A栈中的数据 全部转移到B栈当中,再删除B栈顶数据。
class CQueue {
public:
//建立一个A栈和B栈
stack<int> A ,B;
CQueue() {}
//队尾数据直接入A栈
void appendTail(int value) {
A.push(value);
}
//删除队首数据
/*
当删除队首数据时,会遇到三种情况
第一是B栈不为空
B栈当中有数据,此时可以直接把B栈的栈顶数据读取返回,并
出栈。因为A栈中的数据是倒序进入B栈的,此时B栈栈顶的数值
就是队列的队首数据
第二是A栈为空
直接返回-1,因为队列当中没有数值
第三种A栈有数据,但是B栈为空
此时就需要把A栈中的数据倒序进入B栈,这样队列的队首数据
变成了B栈的栈顶数据。
*/
int deleteHead() {
int temp;
if(!B.empty()){
temp = B.top();//B栈顶部数据读取
B.pop();//B栈的顶部数据出栈
return temp;
}
if(!A.empty()){//A栈不为空的情况
while(!A.empty()){//A栈中的数据倒序放进B栈
temp = A.top();//读取栈顶数据
B.push(temp);
A.pop();
}
}else{//A栈为空的情况
return -1;
}
temp = B.top();
B.pop();
return temp;
}
};
2.剑指Offer 30 包含main函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
解题思路:建立A栈和B栈,A栈进行正常操作而B栈作为一个辅助栈,第一个数据A栈和B栈都要入栈,从第二个数据开始,A栈依旧正常入栈,而对于辅助栈B栈来说,第二个数据要和此时B栈的栈顶数据进行比较,如果比栈顶数据小就进栈,如果不小就放弃进入辅助栈,以此往复。这样A栈的数据是正常进栈的,而B栈的栈顶元素一直是当前最小值。
class MinStack {
public:
/** initialize your data structure here. */
stack<int> A ,B;
MinStack() {}
void push(int x) {
A.push(x);
/*
if(B.top()>=x || B.empty()) 错误
此处的判断条件必须是先判断B栈是否为空,否者会造成运行报错。
报错提示为:Line 175: Char 16: runtime error: reference
binding to misaligned address 0xbebebebebebec0ba for
type'int', which requires 4 byte alignment
原因是B栈在最开始中是为空的无法进行比较
*/
if(B.empty() || B.top() >= x){
B.push(x);
}
}
void pop(){
if(A.top() == B.top()){
/*A栈要进行出栈操作时 要判断A栈和B栈的顶部元素数值是否相同,
如果相同则B栈的栈顶元素一样要出栈,要保持两者一致。
*/
B.pop();
}
A.pop();
}
int top() {
return A.top();
}
int min() {//辅助栈B的栈顶元素一直就是最小值
return B.top();
}
};