記事一覧 P20: 逆ポーランド記法の計算 //------------------------------------------- package chk; class Stack { int[] data; int sp; Stack(int n) {data = new int[n]; sp=0;} void err(){System.out.println("?");} void push(String s){ if(sp >= data.length){err(); return;} data[sp] = Integer.parseInt(s); sp++; } void push(int i){ if(sp >= data.length){err(); return;} data[sp] = i; sp++; } int pop(){ if(sp <=0){err(); return 0;} sp--; return data[sp]; } } public class Main { public static void main(String[] args) { Stack stk = new Stack(10); String[] x = {"12", "34", "+", "10", "*"}; int i, j, k; char c; for(i=0; i < x.length; i++){ System.out.println(x[i]); } for(i=0; i < x.length; i++){ c = x[i].charAt(0); if('0' <= c && c <= '9'){ stk.push(x[i]); }else{ k = stk.pop(); j = stk.pop(); switch(c){ case '+': j += k; break; case '-': j -= k; break; case '*': j *= k; break; case '/': j /= k; break; } stk.push(j); } } if(stk.sp != 1) stk.err(); else System.out.println(stk.data[0]); } } //------------------------------------------- run: 12 34 + 10 * 460 構築成功 (合計時間: 0 秒) //------------------------------------------- |
2. 基本クラス
「Cから見たC++」で述べたように,基本クラスは
構造体にメンバ関数を付加したものです.Java の
場合は「メンバ関数」を「メソッド」といいます.
P20 は逆ポーランド記法で書かれた式を計算するプ
ログラムなので,まず逆ポーランド記法について説
明します[2-1].プログラムで使う通常の計算式
(12 + 34) * 10
は,逆ポーランド記法では
12 34 + 10 *
となります.逆に逆ポーランド記法の
1 2 3 4 5 + + +
は
1 + (2 + (3 + (4 + 5)))
であり,
1 2 + 3 + 4 + 5 +
は
(((1 + 2) + 3) + 4) + 5
を意味します.[2-1]で説明されているように逆ポ
ーランド記法で書かれた数式は 通常スタックを用
いて計算します.
P20 の Stack クラスを見てください.以下に補足
説明を記します.
・data は整数の配列への参照.サイズはコンスト
ラクタの引数で指定.
・sp はスタックポインタで,プッシュ後に sp++.
x[sp] を見たいときは仕様変更が必要です.
・文字列を引数とする push() は入力用.整数を
引数とする push() は計算結果格納用です.
main() では逆ポーランド記法の式は字句解析済み
のデータが String型 のデータの配列にあるとして
手抜き処理をしています.
・式に誤りがあっても例外処理はせずに"?"を表示
して処理を続行します.また,誤りを見逃すこと
もあります.
・計算結果は一般の整数ですが,入力データは負で
ない整数に限定しています.「-123」を入力した
いときは「0 - 123」を使います.
・"12 34 + 10 *" のような文字列を {"12", "34",
"+", "10", "*"} のように分解する関数は自分で
考えてください.
[2-1] 逆ポーランド記法 - Wikipedia
http://ja.wikipedia.org/wiki/%E9%80%86%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95
[2-2] とほほのJava入門/クラス
http://www.tohoho-web.com/java/class.htm
デストラクタは不要と考えられています。
[2-3] スタック - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF
|
Java の基本クラス,派生クラスの話の前に「Cから見たC++」の復習用に progCpp-0.html ~ progCpp-7.html から progCpp.pdf を作って upload しました.「記事一覧」の「Cから見たC++」をクリックすれば表示されます.
プログラムはブログに書き込むとき「<」を「&lt;」にしていますが,説明文等を修正したとき「&lt;」に戻し忘れ,「<」で始まる部分がHTMLのタグとみなされて消滅していることがあります(<stdio.h>等,「Java のプログラム (4)」でも「i<m.length;」の「<」以降が消えました.) <-- 画面コピーでそのままソースファイルとして使えるように半角の「<」で頑張っています.(ただし,この文の「<」は全角)
例示したプログラムがうまく動作しない場合,ご一報頂ければ幸いです.
記事一覧 P15: 多重定義 //------------------------------------------- package chk; public class Main { public static void main(String[] args) { int x[] = {30, 11, 42, 83, 24, 75}; System.out.println(maxi(x[1], x[2])); System.out.println("x[i]<=" + maxi(x)); } public int maxi(int m, int n){ if(m>n) return m; else return n; } public int maxi(int[] m){ int i, n; n=m[0]; for(i=1; i<m.length; i++){ if(m[i]>n) n = m[i]; } return n; } } //------------------------------------------- run: 42 x[i]<=83 構築成功 (合計時間: 0 秒) //------------------------------------------- |
C++ や Java には異なる関数に同じ関数名を用いる
ことができます.オーバーライドについては「派生
クラス」で説明します.P15 はオーバーロードの例
です.maxi(x[1], x[2]) のときは maxi(int, int)
が,maxi(x) のときは maxi(int[]) が呼ばれます.
・m が配列の参照のとき,配列の長さは m.length
です.Cのポインタと異なり実行時も長さの情報
をもっているので,「i<m.length」を「i <= m.
length」に変更すると例外が発生します.
//-------------------------------------------
run:
42
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
at chk.Main.maxi(Main.java:15)
at chk.Main.main(Main.java:6)
Java Result: 1
構築成功 (合計時間: 0 秒)
//-------------------------------------------
[1-17] 多重定義 - Wikipedia
http://ja.wikipedia.org/wiki/%E5%A4%9A%E9%87%8D%E5%AE%9A%E7%BE%A9
[1-18] Javaの道:クラス(8.オーバーライドとオーバーロード)
http://www.javaroad.jp/java_class8.htm
---------------------------
[1-19] 9.4 Abstract Method Declarations
http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.4
・9.4 抽象メソッドの宣言,9.4.1 継承とオーバーライド, 9.4.2 オーバーロード(Google翻訳)
http://translate.google.co.jp/translate?hl=ja&langpair=en%7Cja&u=http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html
・The Java Language Specification, Third Edition 目次
http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html
|