PDA

View Full Version : سوال: برنامه تبدیل عبارت منظم infix به prefix



setaiesh
جمعه 22 آذر 1392, 16:16 عصر
سلام
یه برنامه به زبان جاوا نوشتم که ورودی (رشته عبارت منظم) رو به صورت infix میگیره و خروجی رو به صورت prefix چاپ میکنه. اما هر کاریش میکنم error داره. کسی میتونی راهنماییم کنه؟
این برنامه رو به دو صورت نوشتم:
1) با استفاده از کلاس Scanner
2) با استفاده از کلاس StringTokenizer
توی هردوش به مشکل برخوردم
فعلا همون روش اول رو آپلود میکنم. اگر راهنماییم کنین ممنون میشم.




import java.util.Scanner;
//import java.io.*;
//import java.util.*;
//import javax.swing.JOptionPane;

public class Converter {

public static String str1="";
public static String Arr="";
public static int loopCounter;
public static char char1=' ';
public static int i,j,e,n,t=0;
public static char prefixStack[],prefix[];
public static char stackA[];

public static int olaviat(int primt){
switch(primt)
{
case '+':
case '-':
{return 1;}
case '*':
case '/':
{return 2;}
case '&':
case '|':
{return 3;}
case '@':
case '#':
{return 4;}
case '(':
case ')':
{return 5;}
default: return 0;
}
}

public static void main (String[] args){
//get input
Scanner input = new Scanner(System.in);
System.out.println("Infix To Prefix(without space):");
str1 = input.next();

Arr=str1;

loopCounter=str1.length();
char prefixStack[]=new char [str1.length()];
char prefix[]=new char [str1.length()];
char stackA[]=new char [str1.length()];

while(loopCounter != 0)
{
char1=Arr.charAt(i);
if(char1==')')
{stackA[i]=char1;} //push

else if(char1=='1' || char1=='2' || char1=='3' || char1=='4' || char1=='5' || char1=='6' || char1=='7' || char1=='8' || char1=='9' || char1=='0' )
{prefixStack[i]=char1;}//chap dar khoroojy

else if(char1=='(')
{ e=i;
do{
prefixStack[e]=stackA[j];
j--;
e++;
}while (stackA[j]!=')');
stackA[i]=' ';//parantez baste ra var midaram
}

else if(char1=='+' || char1=='-' || char1=='*' || char1=='/' || char1=='&' || char1=='|' || char1=='@' || char1=='#' )
{
do{
prefixStack[i]=stackA[n];
i++;
}while(olaviat(stackA[n])>= olaviat(char1));
stackA[i]=char1; //push
}
i++;
}

//now: chap prefixStack[i] be soorate reverse
t=str1.length();
for(int y=0;y!=str1.length(); y++)
{
prefix[y] =prefixStack[t];
t--;
}

}
}

arefane
جمعه 22 آذر 1392, 21:42 عصر
سلام خدمت شما دوست عزیز

برنامه شما رو نگاه کردم . نمیدونم منطق برنامه ی شما چجوریه و چرا اینجوری نوشتین؟
بسیاری از متغیرها از نظر من اضافه هستن... اصولا برای تبدیل عبارات منظم، از پشته استفاده میکنن، ولی شما به جای استفاده از کلاس Stack، از یک آرایه به اسم prefixStack استفاده کردید که مسلماً نمیتونه جواب درستی به شما بده ... در ضمن برنامه ی شما runtime error داره که مربوط به این قسمت هست :


char1 = Arr.charAt(i);

در هر حال من فکر میکنم برنامه شما از نظر منطقی مشکل داره... نمونه های زیادی از پیاده سازی تبدیل عبارات infix به prefix در اینترنت وجود داره که با کمی جستجو میتونید پیداشون کنید.
مثل این :
https://github.com/jetpackman/Infix-to-Prefix-Java/blob/master/src/Prefixer.java

موفق باشید

setaiesh
شنبه 23 آذر 1392, 08:12 صبح
سلام خدمت شما دوست عزیز

برنامه شما رو نگاه کردم . نمیدونم منطق برنامه ی شما چجوریه و چرا اینجوری نوشتین؟
بسیاری از متغیرها از نظر من اضافه هستن... اصولا برای تبدیل عبارات منظم، از پشته استفاده میکنن، ولی شما به جای استفاده از کلاس Stack، از یک آرایه به اسم prefixStack استفاده کردید که مسلماً نمیتونه جواب درستی به شما بده ... در ضمن برنامه ی شما runtime error داره که مربوط به این قسمت هست :


char1 = Arr.charAt(i);

در هر حال من فکر میکنم برنامه شما از نظر منطقی مشکل داره... نمونه های زیادی از پیاده سازی تبدیل عبارات infix به prefix در اینترنت وجود داره که با کمی جستجو میتونید پیداشون کنید.
مثل این :
https://github.com/jetpackman/Infix-to-Prefix-Java/blob/master/src/Prefixer.java

موفق باشید

سلام و ممنونم بابت پاسخ
حقیقتش می خواستم که از استک استفاده نکنم.
و بعد این که دقیقا منم نمیدونم چرا اون run time error رو داره!!!
از لینکی که گذاشتین هم ممنونم
منطق کارم اینه:


برای تبدیل عبارات میانوندی به پیشوندی توسط کامپیوتر، ابتدا عبارت را معکوس می نماییم و سپس از چپ به راست پویش می کنیم در ادامه:
پرانتزهای سمت راست (پرانتز بسته) را در پشته push می نماییم.
هنگامی که به یک عملوند می رسیم آن را در خروجی می نویسیم.
هنگامی که به یک عملگر رسیدیم آنگاه عملگرهای بالای پشته که اولویت یکسان یا بالاتر از این عملگر را دارند pop می نماییم و سپس عملگر مذکور را در پشته push می کنیم.
هنگامی که به پرانتز باز (سمت چپ) رسیدیم آنگاه عملگرهای بالای پشته را تا رسیدن به اولین پرانتز بسته (سمت راست)، pop کرده و در خروجی می نویسیم و سپس پرانتز بسته را نیز از پشته pop می کنیم ولی در خروجی نمی نویسیم.
عملیات فوق را تا انتهای عبارت تکرار می نماییم. و در نهایت خروجی را معکوس می کنیم.