理論的根拠
キューは先入れ先出しであり、スタックは先入れ後出しです。
4 つの質問:
- スタックは C++ のコンテナですか?
- 使用するスタックは STL のどのバージョンに属しますか?
- 私たちが使用している STL ではスタックはどのように実装されているのでしょうか?
- stack はスタック空間を横断するためのイテレータを提供しますか?
スタックとキューは、STL (C++ 標準ライブラリ) の 2 つのデータ構造です。
スタックはプッシュやポップなどのインターフェイスを提供し、すべての要素は先入れ後出しルールに準拠する必要があるため、スタックは訪問関数もイテレータも提供しません。set や map とは異なり、すべての要素を走査するために iterator イテレータが提供されます。
スタックは、基礎となるコンテナーを使用してすべての作業を完了し、外部の世界に統合されたインターフェイスを提供します。基礎となるコンテナーはプラグ可能です (つまり、スタックの機能を実装するためにどのコンテナーを使用するかを制御できます)。
スタックの内部構造、スタックの基礎となる実装は、vector、deque、list のすべてが可能ですが、主に配列とリンク リストの基礎となる実装です。
232. スタックを使用したキューの実装
キューは先入れ先出しであり、スタックは先入れ後出しです。
以前に習ったことがあるのですが、ずっと忘れていました。ここで注意する必要があるのは、プッシュ、ポップ、トップの3つの概念であり、この3つの概念を理解していれば、以降の操作が可能になります。コードは次のようになります。
class MyQueue {
public:
//首先声明两个栈,一个入栈一个出栈
stack<int> in;
stack<int> out;
MyQueue() {
}
void push(int x) {
//入栈过程
in.push(x);
}
int pop() {
//首先判断出栈是否为空
while(out.empty())
{
//判断入栈是否为空,在不为空的情况下
while(!in.empty())
{
out.push(in.top());
in.pop();
}
}
int result = out.top();
out.pop();
return result;
}
int peek() {
int result1 = this->pop();
out.push(result1);
return result1;
}
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();
*/
225. キューを使用したスタックの実装
要素をポップアップするプロセスでは、前の size()-1 をポップアウトし、後で追加します。
このコードは比較的単純で、一度実行すると正常に実行されます。
class MyStack {
public:
//首先声明队列
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int queSize = que.size();
queSize = queSize - 1;//首先将数目减一操作
while(queSize--)
{
que.push(que.front());
que.pop();
}
int result = que.front();
que.pop();
return result;
}
int top() {
return que.back();
}
bool empty() {
return que.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();
*/