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

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

スタック(Stack)は、要素の集合を管理するための抽象データ構造の一つです。最大の特徴はLIFO(Last In, First Out:後入れ先出し)方式を採用している点で、最後に追加された要素ほど最初に取り出されます。本記事では、C++の配列を使ってスタックを実装する方法を、完全なサンプルコードとともにわかりやすく解説します。

スタックの主な操作

スタックに対して行える基本的な操作には、次の3つがあります。

  • Push(プッシュ) … スタックの頂上(トップ)に新しいデータを追加する
  • Pop(ポップ) … スタックのトップからデータを取り除く
  • Peek(ピーク) … スタックのトップにあるデータを参照する(取り除かない)

配列によるスタック実装のサンプルコード

以下は、配列を使ってスタックを実装したC++プログラムの完全な例です。メニュー形式で「プッシュ」「ポップ」「表示」「終了」を選択できる対話型の構成になっています。

サンプルコード

#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

プログラムの解説

push()関数:要素をスタックに追加する

push()関数は、引数valとしてスタックに追加したい値を受け取ります。まず変数top(現在のトップ位置)がn-1以上かどうかを判定し、条件を満たしていればスタックに空きがないため「Stack Overflow(オーバーフロー)」を出力します。空きがあればtopを1増やし、その位置にvalを格納します。

void push(int val) {
    if(top>=n-1)
    cout<<"Stack Overflow"<<endl;
    else {
        top++;
        stack[top]=val;
    }
}

pop()関数:要素をスタックから取り出す

pop()関数は、スタックに要素が存在する場合に、最上位の値を取り出して画面に表示し、topを1減らします。スタックが空の場合は「Stack Underflow(アンダーフロー)」を出力します。

void pop() {
    if(top<=-1)
    cout<<"Stack Underflow"<<endl;
    else {
        cout<<"The popped element is "<< stack[top] <<endl;
        top--;
    }
}

display()関数:スタックの中身を表示する

display()関数は、forループを使ってスタック内のすべての要素をトップから順に表示します。スタックが空の場合は「Stack is empty」と出力されます。

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";
}

main()関数:メニューによる操作の選択

main()関数では、ユーザーに対して「プッシュ」「ポップ」「表示」「終了」のいずれかを選択させます。入力された番号に応じてswitch文で対応する関数を呼び出し、無効な値が入力された場合はその旨を通知します。この一連の処理は「4(Exit)」が選択されるまでdo-whileループで繰り返されます。

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;
}

まとめ

このように、配列とtop変数(インデックス)を組み合わせるだけで、LIFO構造を持つスタックを簡単に実装できます。オーバーフローとアンダーフローのチェックを組み込むことで、安全にデータの出し入れができる点も重要なポイントです。より実践的な開発では、STLのstd::stackや連結リストを使った実装も検討するとよいでしょう。

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

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

  2. C++でソート済み配列を実装するプログラム:選択ソートの基本と実装例

    ソート済み配列とは、数値順やアルファベット順など、何らかの基準に従ってすべての要素が整列された配列のことです。配列をソートするためのアルゴリズムには、バブルソート、挿入ソート、選択ソート、マージソート、クイックソート、ヒープソートなど、さまざまな種類があります。本記事では、その中でも「選択ソート」を使って配列をソートする方法について、サンプルコードを交えながら詳しく解説します。選択ソートとは選択ソートは、未ソート部分の中から最小の要素を繰り返し見つけ出し、それを未ソート部分の先頭にある要素と入れ替えることで、徐々にソート済み配列を作り上げていく手法です。実装がシンプルで理解しやすいことが特徴で