C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でスタックを実装する方法:配列を使ったPush・Pop・Peekの基本操作を解説

この記事では、C++を使ってスタック(Stack)を実装する方法を解説します。スタックとは、要素の集合を格納する抽象データ構造の一つで、「LIFO(Last In First Out:後入れ先出し)」という仕組みに基づいて動作します。つまり、最後に追加された要素が最初に取り出されるという特徴があります。

スタックにおける主な基本操作は以下の3つです。

  • Push(プッシュ) … スタックの一番上(トップ)に新しいデータを追加します。

  • Pop(ポップ) … スタックの一番上にあるデータを取り除きます。

  • Peek(ピーク) … スタックの一番上にあるデータを、削除せずに参照します。

以下では、配列を用いてスタックを実装したプログラムを紹介します。

入力例: 要素 11, 22, 33, 44, 55, 66 を順にプッシュ
出力例: 要素 66, 55, 44, 33, 22, 11 の順でポップ

アルゴリズム

push(item)

開始
   トップポインタを1増やす
   top の位置に item を挿入する
終了

pop()

開始
   item = スタックのトップ要素
   トップポインタを1減らす
   item を返す
終了

peek()

開始
   item = スタックのトップ要素
   item を返す
終了

サンプルコード

次のC++プログラムは、サイズ100の整数型配列をスタックとして扱い、メニュー形式でPush・Pop・表示を行えるようにしたものです。スタックが満杯の場合は「Stack Overflow(オーバーフロー)」、空の状態でPopしようとした場合は「Stack Underflow(アンダーフロー)」が表示されるようになっています。

#include <iostream>
using namespace std;
int stack[100], n = 100, top = -1;
void push(int val) {
    if(top >= n-1)
        cout<<"Stack Overflow"<<endl;
    else {
        top++;
        stack[top] = val;
    }
}
void pop() {
    if(top <= -1)
        cout<<"Stack Underflow"<<endl;
    else {
        cout<<"The popped element is "<< stack[top] <<endl;
        top--;
    }
}
void display() {
    if(top>= 0) {
        cout<<"Stack elements are:";
        for(int i = top; i>= 0; i--)
            cout<<stack[i]<<" ";
        cout<<endl;
    } else
        cout<<"Stack is empty";
}
int main() {
    int ch, val;
    cout<<"1) Push in stack"<<endl;
    cout<<"2) Pop from stack"<<endl;
    cout<<"3) Display stack"<<endl;
    cout<<"4) Exit"<<endl;
    do {
        cout<<"Enter choice: "<<endl;
        cin>>ch;
        switch(ch) {
            case 1: {
                cout<<"Enter value to be pushed:"<<endl;
                cin>>val;
                push(val);
                break;
            }
            case 2: {
                pop();
                break;
            }
            case 3: {
                display();
                break;
            }
            case 4: {
                cout<<"Exit"<<endl;
                break;
            }
            default: {
                cout<<"Invalid Choice"<<endl;
            }
        }
    }while(ch != 4);
    return 0;
}

実行結果

1) Push in stack
2) Pop from stack
3) Display stack
4) Exit

Enter choice: 1
Enter value to be pushed: 2
Enter choice: 1
Enter value to be pushed: 6
Enter choice: 1
Enter value to be pushed: 8
Enter choice: 1
Enter value to be pushed: 7
Enter choice: 2
The popped element is 7
Enter choice: 3
Stack elements are:8 6 2
Enter choice: 5
Invalid Choice
Enter choice: 4
Exit

実行結果からも分かるように、最後にプッシュした「7」が最初にポップされており、LIFOの仕組みが正しく機能していることが確認できます。また、存在しない選択肢「5」を入力すると「Invalid Choice」と表示され、不正な入力にも対応しています。


  1. C++で連結リスト(リンクリスト)を使ってスタックを実装する方法【サンプルコード付き解説】

    スタック(Stack)は、要素の集合を管理するための抽象データ構造の一つです。スタックはLIFO(Last In First Out:後入れ先出し)という仕組みに基づいて動作し、最後に追加した要素が最初に取り出されます。スタックにおける主な操作は以下の通りです。 Push(プッシュ):スタックの先頭にデータ値を追加します。 Pop(ポップ):スタックの先頭にあるデータ値を削除します。 Peek(ピーク):スタックの先頭にあるデータ値を参照します(削除は行いません)。 本記事では、連結リスト(リンクリスト)を使用してスタックを実装するC++プログラムを紹介し、その動作の仕組みを詳しく解説しま

  2. 配列を使ってC++でスタックを実装する方法【サンプルコード付きで解説】

    スタック(Stack)は、要素の集合を管理するための抽象データ構造の一つです。最大の特徴はLIFO(Last In, First Out:後入れ先出し)方式を採用している点で、最後に追加された要素ほど最初に取り出されます。本記事では、C++の配列を使ってスタックを実装する方法を、完全なサンプルコードとともにわかりやすく解説します。スタックの主な操作スタックに対して行える基本的な操作には、次の3つがあります。Push(プッシュ) … スタックの頂上(トップ)に新しいデータを追加するPop(ポップ) … スタックのトップからデータを取り除くPeek(ピーク) … スタックのトップにあるデータを参照