C++で指定された操作で最大スタックを構築するプログラム
次の操作をサポートする最大スタックを作成するとします-
-
MaxStk()これにより、最大スタックの新しいインスタンスが構築されます
-
push(val)はvalをスタックに挿入します
-
top()は、スタックから最上位の要素を取得します
-
max()はスタックから最大の要素を取得します
-
pop()は、スタックから最上位の要素を削除して返します
-
popmax()は、スタックから最大の要素を削除して返します
次に、MasStk()を呼び出して最大スタックを構築し、5、15、10などの3つの値をプッシュしてから、それぞれtop()、max()、popmax()、max()pop()、top()関数を呼び出します。その場合、初期スタックステータスは[5、15、10]になり、関数に対応する出力は10、15、15、10、10、5
になります。これを解決するには、次の手順に従います-
-
pos_index:=0
-
1つのセットstkを別のセットauxに定義する
-
コンストラクターを定義します。これは特別なタスクを実行していません
-
関数push()を定義します。これにはvalが必要です
-
pos_index、valをstkに挿入します
-
val、pos_indexをauxに挿入します
-
(pos_indexを1増やします)
-
関数top()を定義する
-
stkが空の場合、-
-
-1を返す
-
-
stkの最初のアイテムの2番目の値を返す
-
関数max()
を定義します -
auxが空の場合、-
-
-1を返す
-
-
auxの最初のアイテムの最初の値を返す
-
関数pop()
を定義します -
stkが空の場合、-
-
-1を返す
-
-
id:=stkの最初のアイテムの最初の値、ret=stkの最初のアイテムの2番目の値
-
stkの最初の要素をstkから削除する
-
auxからペア(ret、id)を削除する
-
retを返す
-
関数popmax()
を定義します -
auxが空の場合、-
-
-1を返す
-
-
ret:=auxの最初のアイテムの最初の値、id=auxの最初のアイテムの2番目の値
-
auxの最初の要素をauxから削除する
-
stkからpair(id、ret)を削除する
-
retを返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h>
using namespace std;
class MaxStk {
int pos_index = 0;
set<pair<int, int>, greater<>> stk, aux;
public:
MaxStk() {}
void push(int val) {
stk.emplace(pos_index, val);
aux.emplace(val, pos_index);
pos_index++;
}
int top() {
if (stk.empty())
return −1;
return stk.begin()−>second;
}
int max() {
if (aux.empty())
return −1;
return aux.begin()−>first;
}
int pop() {
if (stk.empty())
return −1;
int id = stk.begin()−>first, ret = stk.begin()−>second;
stk.erase(stk.begin());
aux.erase({ret, id});
return ret;
}
int popmax() {
if (aux.empty())
return −1;
int ret = aux.begin()−>first, id = aux.begin()−>second;
aux.erase(aux.begin());
stk.erase({id, ret});
return ret;
}
};
int main(){
MaxStk max_stk;
max_stk.push(5);
max_stk.push(15);
max_stk.push(10);
cout << max_stk.top() << endl;
cout << max_stk.max() << endl;
cout << max_stk.popmax() << endl;
cout << max_stk.max() << endl;
cout << max_stk.pop() << endl;
cout << max_stk.top() << endl;
} 入力
max_stk.push(5) max_stk.push(15) max_stk.push(10) max_stk.top() max_stk.max() max_stk.popmax() max_stk.max() max_stk.pop() max_stk.top()
出力
10 15 15 10 10 5
-
特定の操作で各都市から訪問できる都市の数をカウントするC++プログラム
(xi、yi)の形式でN個の座標点Pのリストがあるとします。 x値とy値は、最初のN個の自然数の順列です。 1からNの範囲のkごとに。都市kにいます。操作は何度でも任意に適用できます。操作:現在の都市よりもx座標が小さく、y座標が小さい、またはx座標が大きい、またはy座標が大きい別の都市に移動します。都市kから到達できる都市の数を見つける必要があります。 。 したがって、入力がP =[[1、4]、[2、3]、[3、1]、[4、2]]の場合、出力は[1、1、2、2] ステップ これを解決するには、次の手順に従います- n := size of P Define one 2D array ls
-
特定の条件でグラフを作成するC++プログラム
NとKの2つの数があるとします。N個の要素を持つ無向グラフがあるとします。 N個の頂点は次の条件を満たす- グラフはシンプルで接続されています 頂点には1からNまでの番号が付けられています グラフのエッジの数をMとします。エッジには1からMまでの番号が付けられます。エッジの長さは1です。エッジiは頂点U[i]を頂点V[i]に接続します。 頂点のペア(i、j)は正確にKペアあり、i