day10
栈与队列理论基础:
给了四个问题:
- C++中stack 是容器么?
- 我们使用的stack是属于哪个版本的STL?
- 我们使用的STL中stack是如何实现的?
- stack 提供迭代器来遍历stack空间么?
232.用栈实现队列
用两个栈来实现队列,没思路。
Karl思路:一个输入栈STin,一个输出栈STout。
入队列的时候入到输入栈,这个思路单凭自己想不太到,关键在于出队列的时候,先将STin的出到STout里(数据顺序就反过来了),然后从STout出栈。
因为每次从STin到STout都是早先的元素,而且这些元素是符合出队列顺序的,所以等到STout空的时候再将STin的转移过来,批次之间顺序不会乱。
梳理一下就是STin和STout的元素都分别保持有序,这个设计挺妙的。
class MyQueue {
public:
stack<int> stin, stout;
//这个构造函数怎么写?
MyQueue() {
// 不用写。。。
}
void push(int x) {
stin.push(x);
}
// pop()的实现很巧妙
int pop() {
if (stout.empty()) {
while (!stin.empty()) {
int tmp = stin.top();
stin.pop();
stout.push(tmp);
}
}
int tmp = stout.top();
stout.pop();
return tmp;
}
// 可以用pop()然后再把弹出来的放到stout的栈顶,但说实话,这个思路也是挺巧妙的,放回peek处也是双栈才可以做到的事
int peek() {
if (stout.empty()) {
while (!stin.empty()) {
int tmp = stin.top();
stin.pop();
stout.push(tmp);
}
}
return stout.top();
}
bool empty() {
if (stin.empty() && stout.empty())
return true;
else return false;
}
};
225. 用队列实现栈
还是没思路.
// 两个队列的版本
class MyStack {
public:
queue<int> q1, q2;
MyStack() {
}
void push(int x) {
q1.push(x);
}
int pop() {
while (q1.size() != 1) {
q2.push(q1.front());
q1.pop();
}
int tmp = q1.front();
q1.pop();
// q1 = q2; 竟然可以直接复制;
while (!q2.empty()) {
q1.push(q2.front());
q2.pop();
}
return tmp;
}
int top() {
int tmp = this->pop();
this->push(tmp);
return tmp;
}
bool empty() {
return q1.empty();
}
};
// 单队列实现的,也还行。
class MyStack {
public:
queue<int> q1;
MyStack() {
}
void push(int x) {
q1.push(x);
}
int pop() {
int size = q1.size();
while (size > 1) {
q1.push(q1.front());
q1.pop();
size--;
}
int tmp = q1.front();
q1.pop();
return tmp;
}
int top() {
int tmp = this->pop();
this->push(tmp);
return tmp;
}
bool empty() {
return q1.empty();
}
};