- スタック(stack)
スタックとはでtop(先頭)と呼ばれる端点で挿入・削除が行われる順序付きリストとして定義される。
スタックは以下の性質を持つ。
- 後に格納されたデータが先に取り出され、先に格納されたデータは先に取り出される(この性質をLIFO:Last In First Out,あるいはFILO:First in Last Outという)
- データの出し入れはそれぞれpopとpushで行う
- popが行われるとtopの要素が削除される
- pushが行われるとtop後(上)に要素が追加され新たなtopの要素になる
- スタックが有限長でデータが一杯(full)の状態のスタックにpushしようとするとスタックオーバーフロー(stack overflow)になる、(通常は例外処理される)
- データが空(empty)の状態のスタックからpopしようとするとスタックアンダーフロー(stack underflow)になる、(通常は例外処理される)
- スタックの応用
スタックの性質から次のような用途にも利用される。
- 関数呼び出しの実装(再帰も含む)
- ウェブブラウザの訪問履歴(戻るボタン)
- プログラムのアンドゥ・リドゥの実装
- スタックの実装
class Stack{
int top;
int capacity;
int[] array;
public Stack(int capacity) {
this.capacity=capacity;
this.top=-1;
this.array=new int[this.capacity];
}
public boolean isEmpty() {
return this.top==-1?true:false;
}
public boolean isFull() {
return this.top==this.capacity-1?true:false;
}
public void push(int data) {
if(isFull()){
System.out.println("Stack Overflow");
return;
}else {
System.out.println(data+" is Pushed");
this.array[++this.top]=data;
}
}
public int pop() {
if(isEmpty()) {
System.out.println("Stack is Empty");
return 0;
}else {
System.out.println(array[top]+" is Poped");
return this.array[top--];
}
}
public int top() {
if(isEmpty()) {
System.out.println("Stack is Empty");
return 0;
}else {
System.out.println("top is "+array[top]);
return this.array[top];
}
}
}
サンプルコード