Kalkulator pohon biner java


Pada akhirnya hanya elemen stack yang akan menjadi akar pohon ekspresi. Kami loop melalui ekspresi input dan melakukan mengikuti untuk setiap karakter. Jika karakter adalah operator pop dua nilai dari stack membuat mereka menjadi anak dan dorong node saat ini lagi. Sekarang Untuk membangun pohon ekspresi kita menggunakan stack. Artikel ini disumbangkan oleh Utkarsh Trivedi. Untuk melakukan ini, saya harus mengurai ekspresi algebrik di pohon biner dan kemudian menghitung dan mengembalikan hasilnya. Jadi untuk langkah pertama bagaimana saya bisa mengurai sebuah ekspresi di pohon biner?


Kunjungi anak yang tepat terlebih dahulu. Kita akan membahas beberapa contoh untuk menghitung tinggi pohon biner. Kami menciptakan pohon biner dalam metode utama. Kelas HeightOfTree digunakan untuk menemukan tinggi pohon biner dengan algoritma depth first search. Anda membuat poin yang sangat bagus! Program ini tidak memiliki fungsi utama dari parser ekspresi, mengambil ekspresi dan membangun pohon darinya.


Penerapan jenis pohon ini dapat diperluas ke bidang manipulasi data yang lebih luas. Meski tidak sulit diubah, hal ini dilakukan dengan sengaja untuk menjaga contoh polos dan tidak sulit untuk dimengerti. Solusinya adalah menggunakan tanda kurung ke operasi kelompok. Alih-alih muncul di awal ungkapan, operator akan muncul di dekat akhir. Ekspresi di infiks diselesaikan dengan memulai dari tanda kurung terdalam dan bekerja ke luar. Ketika operasi ditumpuk, menjadi sulit untuk melihat bagaimana operan ini dikelompokkan, namun karena sifat notasi awalan, tidak ada tanda kurung yang diperlukan untuk mengelompokkannya. Ini akan membuat simpul akar pohon. Kelas Node berisi semua yang dibutuhkan untuk mengatur dan mengevaluasi ungkapan. Infiks memang menciptakan beberapa masalah.


Hal ini dapat dicapai dengan ekspresi reguler, atau bahkan manipulasi tumpukan. Ke kiri kecuali node adalah nilai langsung. Sekarang, untuk memecahkan pohon, cukup hubungi metode Solve: Console. Graphing infix ekspresi di pohon cukup rumit karena urutan operasi. Untuk membuat pohon, cukup hubungi konstruktor untuk kelas. Program seperti itu bisa dilakukan dengan banyak perbaikan. Di kelas matematika, kami meliput pelajaran tentang teori grafik, dan sebagai tugas kami mengambil ekspresi, memasukkannya ke pohon dan mengevaluasinya.


Setiap simpul di bawahnya akan ditentukan oleh kelompok yang paling erat terikat ke operator utama. Pada prefiks, semua operator muncul di dekat awal persamaan, dengan dua operan muncul tepat setelahnya. Pohon yang sangat besar akan menyebabkan luapan dan program akan berhenti. Demikian pula, untuk menemukan awalan, infiks, atau notasi postfix untuk ekspresi, sebut fungsi masing-masing, yang semua stringnya kembali. Dari tiga notasi tersebut, infiks adalah satu-satunya yang paling kita kenal. Dengan teknik rekursi sederhana, hampir sepele memanipulasi pohon biner dengan cara apapun. Perhatikan bahwa konstruktor mengambil operator terlebih dahulu, lalu nilai kiri dan kanan. Ketika kedua nilai kiri dan kanan dari sebuah simpul dituliskan, operator yang mengikatnya dapat ditulis.


Hak untuk beralih halaman Dua di antaranya hampir identik, dan yang ketiga dipahami semua orang, karena begitulah cara kita menulis persamaan secara normal. Saat ini, tidak ada validasi yang dilakukan pada ekspresi untuk menguji apakah bisa dipecahkan. Ini adalah kelas pendek yang sangat mendasar yang menerapkan fungsi yang dibutuhkan untuk memecahkan pohon ekspresi, serta menampilkan struktur mereka dalam bentuk awalan, postfix, dan infix. Baru-baru ini, saya menemukan kebutuhan untuk membuat pohon biner berdasarkan ekspresi matematis sebagai masukannya. Akan menarik melihat kelas dikembangkan untuk menangani semua jenis data, tidak hanya numerik. Hal ini disebabkan fakta bahwa fungsi berulang untuk menemukan hasilnya, dan karena itu, tumpukan internal terisi dengan cukup cepat. Tiga fungsi disediakan untuk ekspresi output dalam format postfix, prefix, dan infix. Jenis notasi ini sangat umum dalam bahasa pemrograman dan sejenisnya, karena tidak sulit dipecahkan dengan menggunakan tumpukan.


Cukup sederhana, postfix hanyalah varian awalan. Tanggung jawab saat ini ditempatkan pada pengguna untuk memberikan ekspresi yang baik. Karena itulah saya menulis program ini. Ini dilanjutkan dan diulang sampai tidak ada lagi operator yang tersisa. Saat pergi tidak tersedia, pergi ke simpul di atas Anda dan ke kanan. Ekspresi awalan diselesaikan dengan memindai persamaan untuk operator dengan dua nilai langsung di sebelah kanannya. Kode itu sendiri dienkapsulasi dalam kelas sederhana dengan metode untuk mengembalikan ungkapan di ketiga notasi tersebut, dan juga fungsi untuk memecahkan pohon.


Catatan: Cara kode ini diterapkan, ekspresi yang diwakili dalam notasi infiks akan selalu diberi tanda kurung sepenuhnya. Jika saya punya waktu, saya pasti akan mencoba menerapkan fungsi ini. Dalam notasi ini, semua operator biner muncul di antara kedua operan tersebut. Aturan diutamakan juga harus diikuti, karena kemungkinan ambiguitas dalam interpretasi. Menulis kelas ini terbukti lebih mudah daripada yang saya kira, dan itu pasti telah mempercepat pekerjaan sekolah saya! Pada contoh di atas, tanda perkalian adalah operator utama. Jenis notasi ini bisa dibilang paling mudah untuk digunakan.


Karena cara pemecahan algoritma dan fungsi notasi bekerja, pohon berukuran terbatas. Anda bisa benar-benar membuat kelas token jika Anda mau. CalculatorExpression mengambil string infiks, mengubah string infiks menjadi postfix, dan akhirnya mengambil postfix ke representasi pohon BinaryExpression internal. Helper untuk menghasilkan notasi postfix. Kemudian kode parsing Anda dapat mengkonsumsi setiap bit logis dalam satu waktu. Ekspresi sebagai nama karena akan berjalan di seluruh Sistem.


Inilah metode yang bisa saya bagikan pada pohon biner yang diinginkan berdasarkan BinaryTree. Kelas BinaryTree menyimpan ekspresi postfix. Pilih semua Buka di jendela baru BinaryTree. Infix dan Postfix hanya relevan saat parsing dan serialisasi. Kemudian infiks dan postfix hanya menampilkan proses parsing dan serialisasi pohon ini. Ini bekerja untuk menghasilkan pohon biner yang diberikan sesuai contoh Anda tapi saya perlu menggunakan notasi awalan; Anda bisa mencoba membalikkan logika jika Anda menginginkan solusi postfix lurus. Terlampir adalah dokumen dengan spesifikasi lengkap.


Perhatikan saya membutuhkan ini dalam waktu kurang dari 8 jam. Ini harus menggunakan pohon biner. RPN stack untuk ekspresi ini. Saat ini, parse adalah membangun pohon ekspresi yang salah. Mengembalikan representasi string dari ekspresi. Iklan dihapus untuk pengguna terdaftar. Forum Pemrograman Java adalah komunitas pemrogram Java dari seluruh Dunia.


Komunitas Jawa yang profesional dan ramah. Menangani nomor, operator, dan fungsi. Mengembalikan objek dengan fungsi yang dievaluasi. Jadilah bagian dari komunitas, bantu orang lain, kembangkan pengetahuan Anda tentang Jawa dan senang berbicara dengan orang yang berpikiran sama. Anggota kami memiliki berbagai keterampilan dan mereka semua memiliki satu kesamaan: Semangat belajar dan kode Java. Anggota memiliki akses penuh ke forum. Kami berharap dapat bertemu dengan Anda. Jika token adalah angka, maka tambahkan ke antrian output.


Satu-satunya fungsi yang dievaluasi adalah dosa, tapi Anda bisa menambahkannya sendiri dengan pergi ke Function. Kami mengundang pemrogram Java pemula ke profesional Java untuk dikirim ke sini dan berbagi pengetahuan Anda. Membuat parser baru pada sebuah persamaan. Hanya mengevaluasi jika diurai. Jika token adalah token fungsi, maka dorong ke tumpukan. Proses pendaftaran cepat dan tentunya gratis. Jika token adalah tanda kurung kiri, lalu dorong ke tumpukan.


Jika token di bagian atas tumpukan adalah token fungsi, masukkan ke antrian output. Sama halnya dengan operator manapun. Untuk mengevaluasi dan membedakannya dari Nomor, pertimbangkan untuk mengubah nama bidang bilangan menjadi nilai. Jika saya ingin menambahkan operator yang tidak biasa, seperti negasi, akar kuadrat, faktorial, atau semacamnya, saya tidak hanya perlu menambahkan sebuah kasus, saya perlu mendefinisikan kelas dasar baru untuk Unary Operators, dan sebuah pabrik metode untuk memproduksinya, dan sejumlah hal lainnya. Itulah salah satu alasannya, mengapa dianggap praktik yang buruk untuk menangkap Exception. Kemudian, buatlah Operator bertanggung jawab untuk menangani penyesuaian tumpukan.


Sebagai gantinya, parsing token ke operator, dan hanya saat melewati Anda tahu masalah sebenarnya. Tetap mainkan beberapa baris, cukup instantiate kelas REPL dan jalankan. String dan pengembangan menggunakan Java 7 atau yang lebih baru, maka saya juga akan menyarankan menggunakan switch pada metode statis BinaryOperator. Kelas ini sangat sederhana, namun ada beberapa perubahan kecil yang bisa Anda lakukan untuk mulai mengajarkan kebiasaan baik kepada siswa Anda dengan segera. Ini akan bagus untuk memisahkan operator itu sendiri dari penggunaannya dalam ekspresi dengan nilai kiri dan kanan. Hasil tangkapan RuntimeException Anda berlebihan. Runtime Exceptions juga akan tertangkap saat menangkap Exception.


Semua perintah ini menghasilkan banyak hasil, mengambil jumlah argumen yang berbeda tergantung pada nilai argumen lain, atau keadaan, makna sebenarnya berubah tergantung pada bagian awal program. JVM dan bunuh prosesnya. Alih-alih melempar RuntimeException generik saat membagi dengan nol, buat DivideByZeroException ubahsuaian atau lebih baik lagi, pegang NaN di dalam Nomor dan operator lainnya. Satu hal yang secara khusus menonjol bagi saya di sini dalam program Anda, dan ini adalah Anda membuat sangat sulit untuk memperluas ini untuk memungkinkan jenis operator lainnya. Jika demikian, saya sarankan untuk menggunakan karakter. Pertama, kode CLI: import java. Anda memiliki cerita lengkap dalam metode utama Anda.


Haruskah mengevaluasi mengembalikan Nomor bukan ganda mentah? Parse sebuah pohon ekspresi diberi sebuah string dan kembalikan pohon yang dihasilkan. Gunakan metode JavaDoc untuk metode lengkap. Metode penguraian perlu di refactored ke dalam metode untuk memindai input, mengurai setiap token, menerapkannya ke stack, dan akhirnya mengembalikan hasilnya. Sebagai alternatif, pertimbangkan juga enum. Selain itu: Sistem. Anda bisa drop ini. Ini adalah kalkulator postfix sederhana. Anda mungkin ingin memindahkannya ke metode yang berbeda.


Hal ini umumnya dianggap lebih mudah untuk menggunakan konstanta bernama, bukan string panjang, bagaimana ini terlihat bagi Anda: Sistem. Begitu Anda memiliki dukungan untuk operator umum ini, Anda dapat membangun konsol interaktif di atasnya, di mana pengguna mengeluarkan perintah yang kemudian ditambahkan ke tumpukan, yang kemudian bertahan di antara petunjuk, yang memungkinkan dilakukannya penghitungan yang diperluas. Operator sepenuhnya dari Expressions. Langkah pertama adalah memindahkan kode ini ke kelas terpisah yang dapat mempertahankan tumpukan dan melakukan pekerjaan untuk memanipulasinya dengan metode. Item tunggal yang tertinggal di stack adalah akar pohon. Hal ini membuat penggunaan ulang dan menulis unit test lebih mudah dan membatasi utama menjembatani jurang antara JVM yang meluncurkan aplikasi Anda dengan argumen dan aplikasi itu sendiri. Tambah, panggil saja Add. Operator harus mengetahui berapa banyak operan yang dibutuhkannya, dan seharusnya diberi tumpukan itu sendiri daripada menarik dua nilai dalam lingkaran. InvalidExpressionException dinaikkan jika terjadi masukan yang tidak benar.


Add kemudian bertanggung jawab untuk mengambil dua Ekspresi teratas dari tumpukan, dan menempatkan AdditionExpression yang terbentuk dari mereka ke stack. Parser melakukan terlalu banyak untuk menjejalkannya ke dalam satu metode tunggal, dan bahwa ia mengetahui setiap operator memerlukan dua operan yang melukiskan diri Anda ke sudut. OutOfMemoryError, StackOverflowException dan sejenisnya.

Komentar