Bagaimana menerapkan kekuatan matematika dari algoritma postfix saya - C

Saya memiliki algoritma sederhana untuk membuat postfix di C.

Berikut adalah contoh program dengan tambahan saya untuk menangani pow:

/***********************************************************
* You can use all the programs on  www.c-program-example.com
* for personal and learning purposes. For permissions to use the
* programs for commercial purposes,
* contact [email protected]
* To find more C programs, do visit www.c-program-example.com
* and browse!
* 
*                                  Happy Coding
***********************************************************/

#define SIZE 50            /* Size of Stack */
#include <ctype.h>
char s[SIZE];
int top = -1; /* Global declarations */

push(char elem) { /* Function for PUSH operation */
 s[++top] = elem;
}

char pop() { /* Function for POP operation */
 return (s[top--]);
}

int pr(char elem) { /* Function for precedence */
 switch (elem) {
 case '#':
  return 0;
 case '(':
  return 1;
 case '+':
 case '-':
  return 2;
 case '*':
 case '/':
  return 3;
 case '^':
  return 4;
 }
}

main() { /* Main Program */
 char infx[50], pofx[50], ch, elem;
 int i = 0, k = 0;
 printf("\n\nRead the Infix Expression ? ");
 scanf("%s", infx);
 push('#');
 while ((ch = infx[i++]) != '\0') {
  if (ch == '(')
   push(ch);
  else if (isalnum(ch))
   pofx[k++] = ch;
  else if (ch == ')') {
   while (s[top] != '(')
    pofx[k++] = pop();
   elem = pop(); /* Remove ( */
  } else { /* Operator */
   while (pr(s[top]) >= pr(ch))
    pofx[k++] = pop();
   push(ch);
  }
 }
 while (s[top] != '#') /* Pop from stack till empty */
  pofx[k++] = pop();
 pofx[k] = '\0'; /* Make pofx as valid string */
 printf("\n\nGiven Infix Expn: %s  Postfix Expn: %s\n", infx, pofx);
}

Saya mencoba menerapkan kekuatan matematika, tetapi tidak berhasil, dapatkah Anda membantu saya? Bagaimana saya bisa menerapkannya? Misal inputnya : (1-5)^2^3, dan outputnya 15-2^3^ tapi salah, outputnya benar 15-23^^

Saya pikir, kesalahan itu ada pada metode int pr(char elem) , dapatkah Anda membantu saya lebih lanjut?


person user3139356    schedule 27.12.2013    source sumber
comment
Banyak algoritma untuk notasi pemolesan terbalik - cukup cari di Google   -  person Ed Heal    schedule 27.12.2013
comment
Mengapa saya harus mengunduh sesuatu yang saya tidak mengerti? Saya mengerti ini. Terima kasih atas sarannya yang bermanfaat.   -  person user3139356    schedule 27.12.2013
comment
Ini adalah algoritma yang Anda butuhkan. Ada penjelasan bagus di wikipedia   -  person Ed Heal    schedule 27.12.2013
comment
Terima kasih untuk linknya, tentu saja saya membacanya di wiki, tapi saya tidak bisa mengimplementasikannya,...   -  person user3139356    schedule 27.12.2013
comment
Bisakah Anda menjelaskan hal ini? Ini kode saya, tetapi Anda lupa menghapus tautan ke c-program-example.com/2011/10/   -  person Jongware    schedule 27.12.2013
comment
Saya tidak lupa menghapus link tersebut, saya tidak mengatakan bahwa kode tersebut adalah link saya yang sengaja saya tinggalkan, kode ini saya temukan di internet dan saya berikan kepadanya dan dia mengerti. Saya melihat tentang dewan yang mengaku, hanya proposisi seperti anak-anak.   -  person user3139356    schedule 27.12.2013
comment
Apa? Saya tidak mengerti semua ini.   -  person Martin James    schedule 27.12.2013
comment
MARTIN: Saya mencoba menerapkan kode pada penyakit (pow) di atas, dan mohon saran dari pengunjung forum.   -  person user3139356    schedule 27.12.2013


Jawaban (1)


Masalahnya tidak terletak pada int pr(char elem), karena ini adalah fungsi yang sangat sederhana yang hanya mengembalikan nilai prioritas untuk sebuah operator. Ini lebih halus dari itu:

Angka (dan sebenarnya juga karakter alfabet) langsung 'didorong' ke pofx. Tanda kurung dan operator perlu disimpan sementara di tumpukannya sendiri: s. Hanya di akhir string, atau ketika operator dengan prioritas lebih tinggi ditemukan, operator yang saat ini ada di tumpukannya sendiri perlu ditambahkan ke pofx:

./infix "(1-5)+2*3"
pushing number '1'
pushing operator '-' (top is ()
pushing number '5'
resolving parentheses
pushing operator '+' (top is #)
pushing number '2'
pushing operator '*' (top is +)
pushing number '3'
Postfix Expn: 15-23*+

Kode asli memeriksa prioritas "lebih tinggi atausama":

.. /* Operator */
   while (pr(s[top]) >= pr(ch))

Mengingat bagian ..^2^3, urutan dorongannya adalah

^ - operator, #4 -> push on operand stack
2 - digit -> push immediately
^ - operator, #4 -> operand stack is '^' which is *equal*, so move to output stack
    and push next operand
3 - digit -> push immediately
.. end of input, move operand stack ('^' only) to end of output

Jika Anda mengubah perbandingannya, ini akan berfungsi dengan benar:

while (pr(s[top]) > pr(ch))
person Jongware    schedule 27.12.2013
comment
Terima kasih kembali! Saya harap ini juga menjelaskan algoritma umum untuk Anda. (Saran: bisakah Anda mengubah judul Anda menjadi sesuatu yang lain selain penyakit? Tampaknya ada kesalahan penerjemahan yang terjadi.) - person Jongware; 27.12.2013
comment
(Saya mengedit komentar saya) - Ya, berhasil, dan bagaimana dengan contoh ini masukan: 3+4*2/(1-5)^2^3, keluaran: 3 4 2 1 5 - 2 3 ^ ^ / * + , tetapi keluaran yang benar adalah 3 4 2 * 1 5 − 2 3 ^ ^ / + - person user3139356; 27.12.2013
comment
Hal ini dikarenakan * dan / saat ini memiliki prioritas yang sama. Jika Anda mengubah * untuk mengembalikan prioritas lebih tinggi dari /, Anda akan mendapatkan keluaran yang benar. - person Jongware; 27.12.2013
comment
Terima kasih, saya berubah, tapi saya selalu mendapatkan hasil yang sama buruknya... int pr(char elem) { /* Fungsi untuk diutamakan / switch (elem) { case '#': return 0; kasus '(': pengembalian 1; kasus '+': kasus '-': pengembalian 2; kasus '/': pengembalian 3; kasus '': pengembalian 4; kasus '^': pengembalian 5; } } - person user3139356; 27.12.2013
comment
Fungsi baru Anda pr sudah benar tetapi saya tidak dapat menduplikasi hasilnya. Menggunakan kode asli Anda dan dengan perubahan saya serta fungsi pr yang baru, saya mendapatkan hasil yang benar. - person Jongware; 27.12.2013
comment
Heh, SEKARANG berhasil, saya tidak tahu, di mana masalahnya, dan sekarang tidak apa-apa, terima kasih banyak! (proyeknya ke sekolah, .. menggambar fungsi matematika) :) Terima kasih Jongware, sampai jumpa :-) - person user3139356; 27.12.2013