Day 10 回归
STL教程(五):C++ STL常用容器之deque - 知乎 (zhihu.com) deque
一、理论学习
栈和队列这两种数据结构。关于这四个问题。
- C++中stack 是容器么?
- 我们使用的stack是属于哪个版本的STL?SGI STL
- 我们使用的STL中stack是如何实现的?栈的底层实现可以是vector,deque,list 都可以, 主要就是数组和链表的底层实现。
- stack 提供迭代器来遍历stack空间么?栈不提供走访功能,也不提供迭代器(iterator)
二、刷题部分
用栈实现队列的思路是;用两个栈来颠倒顺序一正一反就得到了队列 想要的顺序。 相当于。 一个倒扣的杯子。 我们将它翻一次。 得到的就是。 正的杯子。 所以说对于push pop peek和Empty操作的话。 这当中最 重要的应该是pop操作。 我们看到我们在做push的时候一直都是push在in这个栈里面。 然后我们做pop的时候一直都是pop的是我们的 Out这栈。 那么我们来简单模拟一下。 我们有一个元素进入那我们就把它插到我们的in这个栈当中,然后呢,多插入几个之后就有了一个”小杯子“,然后我们将它,呃,在我们的这个。 Out为空的时候全部倒进去那这样我们去pop的时候得到的就是一个正序的一个序列。 那么这时候又来元素了怎么办?我们直接加到in里面,那如果我们想要pop的时候我们会发现我们的out里面还有没pop玩的元素直接在out里面pop就行了。
说明:
-
void push(int x)
将元素 x 推到队列的末尾 -
int pop()
从队列的开头移除并返回元素 -
int peek()
返回队列开头的元素 -
boolean empty()
如果队列为空,返回true
;否则,返回false
class MyQueue { public: stack<int>in; stack<int>out; MyQueue() { } //进照进 void push(int x) { in.push(x); } //从队列的开头移除并返回元素 int pop() { if(out.empty()){ while(!in.empty()){ out.push(in.top()); in.pop(); } } int res = out.top(); out.pop(); return res; } int peek() { int ans=this->pop(); out.push(ans); return ans; } bool empty() { return in.empty()&&out.empty(); } }; /** * Your MyQueue object will be instantiated and called as such: * MyQueue* obj = new MyQueue(); * obj->push(x); * int param_2 = obj->pop(); * int param_3 = obj->peek(); * bool param_4 = obj->empty(); */
用队列去实现栈, 会发现之前那个理论不对。 因为队列本来就是正序的,无论你用队列翻转几次,他都还是正序。 这样呢,我们想到一个好方法,我们只需要将 所有的元素,依次向后移。 直到我们栈的出栈元素为止。
class MyStack { public: queue<int>in; MyStack() { } void push(int x) { in.push(x); } int pop() { int size=in.size(); size--; while(size--){ in.push(in.front()); in.pop(); } int res=in.front(); in.pop(); return res; } int top() { int ans=this->pop(); in.push(ans); return ans; } bool empty() { return in.empty(); } }; /** * Your MyStack object will be instantiated and called as such: * MyStack* obj = new MyStack(); * obj->push(x); * int param_2 = obj->pop(); * int param_3 = obj->top(); * bool param_4 = obj->empty(); */
三、碎碎念
今天状态其实不是很好,中途有很多时间都是浪费的。 其实满打满算两个小时应该是没有做到的,但是也没有心情 去补 今天的东西。 然后我最近也比较迷茫, 时间真的是能淡忘一切的东西。 从一开始我不愿意去接受然后无所事事到尝试着去。 但不知道这样的改变有没有意义。 再到现在,我希望努力的去争取去准备去为我的 不可知而又凶险的将来做一些打算的时候, 但又因为。 这种。 未知和凶险。 让我的进度和动力都不足。 处于一个准备和不准备的中间态。 很讨厌,很讨厌这种状态。 马上就是新的一年了。 我想把能做的事全部都做好。 所以说我应该着手去准备。 关于笔试,关于面试。 等等。 不应该让。 刷题。 成为我一天的任务。 而是应该规定自己什么时间去完成这个刷。题工作。 要克服。 不能早起。 的坏习惯。 如果早上的时间可以完成刷题总结,那么下午的时间就可以用来做别的一些事情,那这样一天的安排才会比较合理。 其实还有很多想说的话,但是。 在书面上的就尽于此了。