📙 スタック.

📌スタックの特徴.

  • 一時的にデータを退避したい時に有効なデータ構造で、LIFOの原則に従ったデータ構造.

📌スタックの手順.

1️⃣push(x):スタックのトップに要素xを追加.
2️⃣pop():スタックのトップから要素を取り出す.
3️⃣isEmpty():スタックが空かどうかを調べる.
4️⃣isFull():スタックが満杯かどうかを調べる.

逆ポーランド記法で記述された数式は、スタックを用いて計算が可能.

pushは最後尾に要素追加、popは最後尾から要素取得.

int top, S[1000];

// 要素の追加
void push(int x) {
    // topを加算して要素挿入.
    S[++top] = x;
}

// 要素の取得
int pop() {
    top--;
    // indexがtopの要素取得
    return S[top+1]; 
}

スタック操作の計算量はpop、pushともにO(1)となる.

int main(void){
    
    vector<string> strList = { "7", "3", "+", "10", "8", "-", "7", "4", "*" };
    
    int a, b;
    top = 0;
    
    for (int i = 0; i < strList.size(); i++) {
        if (strList[i] == "+") {
            a = pop();
            b = pop();
            cout << a + b << endl;
            push(a + b);
        } else if (strList[i] == "-") {
            b = pop();
            a = pop();
            cout << a - b << endl;
            push(a - b);
        } else if (strList[i] == "*") {
            a = pop();
            b = pop();
            cout << a * b << endl;
            push(a * b);
        } else {
            int num = stoi(strList[i]);
            push(num);
        }
    }
    printf("%d\n", pop());
    return 0;
}

🔎対象ソースは以下に格納.

/source/2.structure/stack.cpp