1

私は (スタックを使用して) ポストフィックス プログラムへのインフィックスに取り組んでいましたが、これらすべての努力の後、どこかで問題が発生しました。変換せずにインフィックスとして出力を取得しています。私の intopost メソッドが正しいかどうかを確認してください。

    //stack class also containing the intopostfix method
   import java.util.*;
    public class Stack 
    {   int i,j;
char postfix[];
char stack[];
int top;
String post;
public Stack(int n)
{
    stack=new char[n];
    top=-1;
}
public void push(char item)
{
    if(top>=stack.length)
        System.out.println("Stack overflow");
    else
    {
        stack[++top]=item;
    }
}
public char pop()
{
    if(top==-1)
    {       System.out.println("Stack underflow");
            return 0;
    }
    else
        return stack[top--];
}
boolean isAlpha(char ch)
{
    if((ch>='a'&&ch<='z')||(ch>=0&&ch<='9'))
        return true;
    else 
        return false;

}
boolean isOperator(char ch)
{
    if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
        return true;
    else return false;

}

void intopost(String str)
{
    postfix=new char[str.length()];
    char ch;

    j=0;

    for(i=0;i<str.length();i++)
    {
        ch=str.charAt(i);
        if(ch=='(')
            push(ch);
        else if(isAlpha(ch))
        {
            postfix[j++]=ch;
        }
        else if(isOperator(ch))
        {
            push (ch);
        }
        else if(ch==')')
        {
            while((pop())!='(')
                    {
                        postfix[j++]=pop();
                    }
        }

    }

}
void disp()
{
    for(i=0;i<postfix.length;i++)
    {   
        System.out.print(postfix[i]);
    }
}
}
4

5 に答える 5

1

最初に次の行を変更します

if((ch>='a'&&ch<='z')||(ch>=0&&ch<='9'))

の中へ

if((ch>='a'&&ch<='z')||(ch>='0' &&ch<='9'))

その後

else if(ch==')')
    {
        while((pop())!='(')
                {
                    postfix[j++]=pop();
                }
    }

ここでは pop 関数を 2 回呼び出しています。これにより、スタックがアンダーフローします。一度呼び出す必要があります。

そして最後に次のことを試してください

void intopost(String str)
{
postfix=new char[str.length()];
char ch;

j=0;

for(i=0;i<str.length();i++)
{
    ch=str.charAt(i);
    if(ch=='(')
        push(ch);
    else if(isAlpha(ch))
    {
        postfix[j++]=ch;
    }
    else if(isOperator(ch))
    {
        push (ch);
    }
    else if(ch==')')
    {
        char c  = pop();
        while(c!='(')
                {                        
                    postfix[j++]=c;
                    c= pop();
                }
    }

}

}

于 2012-10-01T05:08:32.223 に答える
1

次のプログラムはあなたのために仕事をします

import java.io.*;
class stack
{
    char stack1[]=new char[20];
    int top;
    void push(char ch)
    {
        top++;
        stack1[top]=ch;
    }
    char pop()
    {
        char ch;
        ch=stack1[top];
        top--;
        return ch;
    }
    int pre(char ch)
    {
        switch(ch)
        {
            case '-':return 1;
            case '+':return 1;
            case '*':return 2;
            case '/':return 2;
        }
        return 0;
    }
    boolean operator(char ch)
    {
        if(ch=='/'||ch=='*'||ch=='+'||ch=='-')
            return true;
        else
            return false;
    }
    boolean isAlpha(char ch)
    {
        if(ch>='a'&&ch<='z'||ch>='0'&&ch=='9')
            return true;
        else
            return false;
    }
    void postfix(String str)
    {
        char output[]=new char[str.length()];
        char ch;
        int p=0,i;
        for(i=0;i<str.length();i++)
        {
            ch=str.charAt(i);   
            if(ch=='(')
            {
                push(ch);
            }
            else if(isAlpha(ch))
            {
                output[p++]=ch;
            }
            else if(operator(ch))
            {
                if(stack1[top]==0||(pre(ch)>pre(stack1[top]))||stack1[top]=='(')
            {
                push(ch);
            }
            }
            else if(pre(ch)<=pre(stack1[top]))
            {
                output[p++]=pop();
                push(ch);
            }
            else if(ch=='(')
            {
                while((ch=pop())!='(')
                {
                    output[p++]=ch;
                }
            }
        }
        while(top!=0)
        {
            output[p++]=pop();
        }
        for(int j=0;j<str.length();j++)
        {
            System.out.print(output[j]);    
        }
    }
}
class intopost
{
    public static void main(String[] args)throws Exception
    {
        String s;
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        stack b=new stack();
        System.out.println("Enter input string");
        s=br.readLine();
        System.out.println("Input String:"+s);
        System.out.println("Output String:");
        b.postfix(s);
    }
}

Output:
Enter input string
a+b*c
Input String:a+b*c
Output String:
abc*+
Enter input string
a+(b*c)/d
Input String:a+(b*c)/d
Output String:
abc*d/)(+
于 2012-10-01T04:58:48.470 に答える
0

このコードを試してください

    /**
  * Checks if the input is operator or not
  * @param c input to be checked
  * @return true if operator
  */
 private boolean isOperator(char c){
  if(c == '+' || c == '-' || c == '*' || c =='/' || c == '^')
   return true;
  return false;
 }

 /**
  * Checks if c2 has same or higher precedence than c1
  * @param c1 first operator
  * @param c2 second operator
  * @return true if c2 has same or higher precedence
  */
 private boolean checkPrecedence(char c1, char c2){
  if((c2 == '+' || c2 == '-') && (c1 == '+' || c1 == '-'))
   return true;
  else if((c2 == '*' || c2 == '/') && (c1 == '+' || c1 == '-' || c1 == '*' || c1 == '/'))
   return true;
  else if((c2 == '^') && (c1 == '+' || c1 == '-' || c1 == '*' || c1 == '/'))
   return true;
  else
   return false;
 }

 /**
  * Converts infix expression to postfix
  * @param infix infix expression to be converted
  * @return postfix expression
  */
 public String convert(String infix){
  String postfix = "";  //equivalent postfix is empty initially
  Stack<Character> s = new Stack<>();  //stack to hold symbols
  s.push('#');  //symbol to denote end of stack


  for(int i = 0; i < infix.length(); i++){
   char inputSymbol = infix.charAt(i);  //symbol to be processed
   if(isOperator(inputSymbol)){  //if a operator
    //repeatedly pops if stack top has same or higher precedence
    while(checkPrecedence(inputSymbol, s.peek()))
     postfix += s.pop();
    s.push(inputSymbol);
   }
   else if(inputSymbol == '(')
    s.push(inputSymbol);  //push if left parenthesis
   else if(inputSymbol == ')'){
    //repeatedly pops if right parenthesis until left parenthesis is found
    while(s.peek() != '(') 
     postfix += s.pop();
    s.pop();
   }
   else
    postfix += inputSymbol;
  }

  //pops all elements of stack left
  while(s.peek() != '#'){
   postfix += s.pop();     
  }

  return postfix;
 }

これは、私のブログhereから取得したものです。にアクセスして完全なコードを取得し、変換の各ステップを詳細に確認してください。また、ここでは括弧と指数の両方も考慮され、任意の式を変換できることに注意してください。

于 2014-05-06T17:32:09.067 に答える