目录
day1:
前言:
栈(stack)是基本的数据结构之一,特点是先进后出。
在c++中栈的头文件是:
#include<stack>
stack的声明和常见操作(以int型为例):
stack<int> a;
int x;
a.top(); //返回栈顶元素
a.pop(); //删除栈顶元素
a.size(); //返回栈中的元素的个数
a.push(x); //将x压入栈顶
a.empty(); //检查栈是否为空,若为空返回true,否则返回false
一. 剑指 Offer 09. 用两个栈实现队列
题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别
完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返
回 -1 )
示例:
输入:
[ "CQueue", "appendTail", "deleteHead", "deleteHead", "deleteHead" ]
[ [], [3], [], [], [] ]
输出:[ null, null, 3, -1, -1]
解释:
[ "CQueue"(清空队列,此操作不需要输入数所以第二行给了一个[],没有输出所以是null),
"appendTail"(添加元素,添加的元素是3,对应第二行[3],同样没有输出所以是[]),
"deleteHead"(调用了deleteHead函数此操作不需要输入数所以第二行给了一个[],然后删除了队列的第一个元素后返回3,即输出为3),
"deleteHead"(此时队列没有元素了,再次执行删除操作返回-1)]
解题思路:
1. 加入队尾 appendTail() : 将数字 val 加入栈 A 即可。
2. 删除队首deleteHead() : 有以下三种情况。
当栈 B 不为空: B中仍有已完成倒序的元素,因此直接返回 B 的栈顶元素。
否则,当 A 为空: 即两个栈都为空,无元素,因此返回 -1 。
否则: 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。
C++代码:
注意:Python 和 Java 的栈的 pop() 函数返回栈顶元素,而 C++ 不返回;因此对于 C++ ,需要先使用 top() 方法暂存栈顶元素,再执行 pop() 出栈操作。
class CQueue {
public:
stack<int> A, B;
CQueue() {
}
void appendTail(int value) {
A.push(value);
}
int deleteHead() {
if(B.empty() == 0){
int temp = B.top();
B.pop();
return temp;
}
if(A.empty()) return -1;
while(A.empty() == 0){
int temp = A.top();
A.pop();
B.push(temp);
}
int temp = B.top();
B.pop();
return temp;
}
};
/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/
二. 剑指 Offer 30. 包含 min 函数的栈
题目:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用
min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
解题思路:
定义两个栈:
栈A: 用于存储所有元素
栈B:存储栈 A
中所有 非严格降序 元素的子序列,则栈 A
中的最小元素始终对应栈 B
的栈顶元素。此时, min()
函数只需返回栈 B
的栈顶元素即可。
C++代码:
class MinStack {
public:
/** initialize your data structure here. */
stack<int> A, B;
MinStack() {
}
void push(int x) {
A.push(x);
if(B.empty() || B.top() >= x)
B.push(x);
}
void pop() {
if(A.top() == B.top())
B.pop();
A.pop();
}
int top() {
return A.top();
}
int min() {
return B.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(x);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->min();
*/
题目源自: