题目一
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
解法:一,两个栈来回转数据,保证栈1中按队列顺序排列;二,一个输入栈,一个输出栈,pop时先pop输出栈,没用把栈1的转过来再pop
class CQueue {
private:
stack<int> s1,s2;
void trans(){
while(!s1.empty()){
s2.push(s1.top());
s1.pop();
}
}
public:
CQueue() {}
void appendTail(int value) {
s1.push(value);
}
int deleteHead() {
int value;
if(!s2.empty()){
value = s2.top();
s2.pop();
return value;
}
else{
if(!s1.empty()){
trans();
value = s2.top();
s2.pop();
return value;
}
else{
return -1;
}
}
}
};
题目二
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof
解法:一,两个栈,栈2用于保存目前最小值;二,一个栈,栈里存pair;三,差值栈,维护最小值,栈中存与最小值的差值,pop时反向维护最小值
class MinStack {
private:
long long minn;
stack<long long> s;
public:
/** initialize your data structure here. */
MinStack() {}
void push(int x) {
if(s.empty()){
s.push(0);
minn = x;
return;
}else{
s.push((long long)x-minn);
if(x<minn){
minn=x;
}
}
}
void pop() {
if(s.top()<0){
minn -= s.top();
}
s.pop();
}
int top() {
if(s.top()>0){
return minn+s.top();
}
return minn;
}
int min() {
return minn;
}
};