复习栈(stack)的基本操作
C++中的栈(stack)是一种后进先出(Last In First Out, LIFO)的数据结构,是标准模板库(Standard Template Library, STL)的一部分。它允许只在栈顶进行添加(push)或删除(pop)元素的操作。下面列出了C++中使用std::stack
时的一些基本操作:
-
包含头文件:在使用
std::stack
之前,需要包含头文件<stack>
。#include <stack>
-
创建栈:可以创建一个空栈,也可以通过复制另一个栈来创建。
std::stack<int> myStack; // 创建一个空的int类型的栈
-
添加元素(push):使用
push()
方法在栈顶添加一个新元素。myStack.push(10); // 在栈顶添加元素10
-
删除元素(pop):使用
pop()
方法移除栈顶的元素。注意,pop()
方法不返回被移除的元素。myStack.pop(); // 移除栈顶元素
-
访问栈顶元素(top):使用
top()
方法可以查看栈顶的元素,但不移除它。int topElement = myStack.top(); // 获取栈顶元素
-
检查栈是否为空(empty):使用
empty()
方法可以检查栈是否为空。如果栈为空,返回true
;否则返回false
。bool isEmpty = myStack.empty(); // 检查栈是否为空
-
获取栈的大小(size):使用
size()
方法可以获取栈中元素的数量。size_t stackSize = myStack.size(); // 获取栈的大小
这些操作构成了操作C++中std::stack
的基础,足以处理大多数与栈相关的问题。需要注意的是,std::stack
是一个容器适配器,它默认使用std::deque
作为其底层容器,但也可以通过模板参数指定使用其他类型的容器,比如std::vector
或std::list
。
复习队列的基本操作
在C++中,队列(queue)是一种先进先出(First In First Out, FIFO)的数据结构,它允许在一端(队尾)添加元素,在另一端(队首)移除元素。这种数据结构在标准模板库(Standard Template Library, STL)中通过std::queue
模板类提供。下面是使用std::queue
时的一些基本操作:
-
包含头文件:在使用
std::queue
之前,需要包含头文件<queue>
。#include <queue>
-
创建队列:可以创建一个空队列。
std::queue<int> myQueue; // 创建一个空的int类型的队列
-
添加元素(push):使用
push()
方法在队尾添加一个新元素。myQueue.push(10); // 在队尾添加元素10
-
删除元素(pop):使用
pop()
方法移除队首的元素。注意,pop()
方法不返回被移除的元素。myQueue.pop(); // 移除队首元素
-
访问队首元素(front):使用
front()
方法可以查看队首的元素,但不移除它。int frontElement = myQueue.front(); // 获取队首元素
-
访问队尾元素(back):使用
back()
方法可以查看队尾的元素。int backElement = myQueue.back(); // 获取队尾元素
-
检查队列是否为空(empty):使用
empty()
方法可以检查队列是否为空。如果队列为空,返回true
;否则返回false
。bool isEmpty = myQueue.empty(); // 检查队列是否为空
-
获取队列的大小(size):使用
size()
方法可以获取队列中元素的数量。size_t queueSize = myQueue.size(); // 获取队列中元素的数量
这些是std::queue
中最基本的操作,足以处理大多数与队列相关的任务。在实际编程中,根据具体需求选择合适的操作来管理数据是非常重要的。
232. 用栈实现队列
Problem: 232. 用栈实现队列
1.思路
我的思路
push :压入栈A中
pop:从栈A取出元素,依次压入栈B,当栈A为空时,栈B的top元素即位队列的首元素,压出栈B的top元素,并从栈B取出元素,依次压回栈A
peek:原理与pop类型
empty:只要判断栈A是否为空即可
栈的pop是没有返回值的,所以int a =sta.pop()是错误的写法,只能用sta.top()获取栈的头部元素
官方题解的思路:
在pop的时候,不需要在把栈B的元素压回道栈A,如果是pop,只要栈B非空,就从栈B的pop输出,如果栈B为空,就将栈A的元素压入到栈B,再从栈B.pop。
push依旧是直接压入栈A,empty需要栈A和栈B均为空。
官方的题解思路会比我自己想的稍微复杂一点点,但是时间复杂度减少了。
2.Code
我的思路
class MyQueue {
private: stack<int> a, b;
public:
MyQueue() {
}
void push(int x) {
a.push(x);
}
int pop() {
while(!a.empty()){
//栈在pop的时候是不会返回头部元素的
b.push(a.top());
a.pop();
}
int num = b.top();
b.pop();
while(!b.empty()){
a.push(b.top());
b.pop();
}
return num;
}
int peek() {
while(!a.empty()){
b.push(a.top());
a.pop();
}
int num=b.top();
while(!b.empty()){
a.push(b.top());
b.pop();
}
return num;
}
bool empty() {
return a.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();
*/
225. 用队列实现栈
Problem: 225. 用队列实现栈
1.思路
我的思路
想要获取到队列的队尾元素,可以用myqueue.back()
,但是想删除队列的队尾元素,只能遍历到队列的队尾去删除。但是队列中是没有迭代器去遍历的,只能用队列b暂存队列a的除队尾以外的其他元素,之后在将队列b的元素依次压入队列a中即可。
2.Code
class MyStack {
private: queue<int> a, b;
public:
MyStack() {}
void push(int x) {
a.push(x);
}
int pop() {
int num;
while(!a.empty()){
int cur = a.front();
if(a.size()==1) num = cur;
else b.push(cur);
a.pop();
}
while(!b.empty()){
a.push(b.front());
b.pop();
}
return num;
}
int top() {
return a.back();
}
bool empty() {
return a.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();
*/