Pregunta

Hay muchos algoritmos para convertir de infijo a postfijo de toda la web.Pero mi pregunta es cómo hacer que a funciones de apoyo?Por ejemplo sin(x+y)*z.

Agradecería un código.

¿Fue útil?

Solución

Si está buscando un algoritmo que le dé la conversión Infix a Postfix, incluida la función de soporte de llamada de función, puede usar el pseudocódigo a continuación (que se ve como el código de Python). He escrito esto por mi caso, pero aún no he probado toboughly. Si encuentra algún error, por favor hágamelo saber.

También he escrito una implementación de Java para el mismo.

también, hay pocas cosas para notar sobre esta implementación:

  1. Este algoritmo asume un flujo de tokens en infijo. No analiza una cadena de expresión. Por lo tanto, cada token se puede identificar como un operando, operador, llamada de función, etc.

  2. Hay 7 tipos diferentes de tokens:

    • operands x, y etc
    • paranthesis izquierda - (
    • paranthesis derecha -)
    • Operadores - +, *
    • comienza la llamada de la función - Sin (
    • Función Llamada termina - Sin (x )
    • coma -,
  3. Los arranques de llamada de función se denotan por [ El carácter en el algoritmo y los extremos de la llamada de función se denotan por ]. Tenga en cuenta que la terminación de la llamada de la función es una token diferente que la paranthesis derecha generacacodiCode, aunque pueden estar representadas por el mismo carácter en la expresión de cadena.

  4. Cada operador es un operador binario con prioridad y asociatividad como su significado habitual.

  5. coma ) es un operador binario especial con precedencia de , y asociatividad como se deja (igual que + y *). El operador de comas se utiliza para separar los argumentos de una llamada de función. Así que para una función llamada:

    f(a,b,c)
    
    first comma separates a and b
    second comma separates a,b and c
    
    So the postfix for the above will be 
    ab,c,f
    

    Puede ver el operador de coma como una función Agregar a la lista que agrega el segundo argumento a la lista especificada por el primer argumento o si ambos son valores individuales, crea una lista de dos valores.

  6. Algoritmo

    infix_to_postfix(infix):
    
        postfix = []
        infix.add(')')
        stack = []
        stack.push('(')
        for each token in infix: 
            if token is operand:
                postfix.add(token)
            if token is '[':
                stack.push(token)
            else if token is operator:
                if stack is empty OR 
                   stack[top] is '(' or stack[top] is '[':
                    stack.push(token)
                else if (operator)token['precedence'] > stack[top]['precedence'] OR
                   ( (operator)token['precedence'] == stack[top]['precedence'] AND 
                     (operator)token['associativity') == 'RIGHT' ):
                    stack.push(token)     
                else
                    postfix.add(stack.pop())
                    stack.push(token)
            else if token is '(':
                stack.push(token)
            else if token is ')':            
                while topToken = stack.pop() NOT '(':
                    postfix.add(topToken)
            else if token is ']':
                while True:
                    topToken = stack.pop()
                    postfix.add(topToken)
                    if topToken is '[':
                        break
    
            else if token is ',':
                while topToken = stack.peek() NOT '[':
                    postfix.add(topToken)
                    stack.pop()
                stack.push(token)
    

Otros consejos

Eso es bastante fácil: funciona con funciones también, los operadores regulares que usa (como +, -, *) también son funciones.Su problema es que lo que considere "Función" (como el pecado) no está en infijo, pero están en prefijo.

Para volver a su problema: simplemente convierta estas funciones de prefijo en Postfix (debe encontrar el prefijo a Postfix en la Web también: mi suposición es que no conoce el término "prefijo") de antemano.

Editar : Basicaly No es nada más que primero convierta los argumentos y los envíe en secuencia y agregue el nombre de la función después.

El código que tendrá que trabajar fuera de ti mismo.Utilizando su caso como un ejemplo podría ayudarle a conseguir comenzado;la forma de postfix sin(x + y) * z sería:

x y + sen z *

Tenga en cuenta que en este ejemplo algunas de las operaciones de la operación en dos valores (+ y *), y de los demás (sin)

operadores binarios como + puede ser considerado como +(x,y) De igual manera, Considere sen, cos, etc funciones como operadores unarios.Así que, sin(x+y)*z puede ser escrito como x y + sin z *.Usted necesita dar a estas funciones unarias tratamiento especial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top