簡體   English   中英

中綴到后綴表達式解析(帶有 Swing 實現的 JAVA)

[英]Infix To Postfix Expression Parsing (JAVA w/ Swing Implementation)

I was tasked to Create a JAVA Swing GUI Program implementation that will output the Infix to Postfix and Infix to Prefix Notation Conversion, as well as how the conversion takes place via The Expression Parsing of the Prefix Stack and Operator Stack one by one. 在這種情況下,我使用了 JTable 到 output 表達式解析以及掃描中綴符號運算符和操作數。

問題:我很難在 JTable 中創建輸出前綴堆棧和運算符堆棧的邏輯。 如下圖所示:表 1.1

這是我們的任務創建的目標:表 1.2

中綴到前綴符號轉換也是如此:表 1.3

除了我在表 1.1 中創建的內容之外,還有其他人有什么想法嗎?

后綴代碼的中綴:

public static int precedence(char o){
    switch(o){
        case '+':
        case '-':
            return 1;
        case '*':
        case '/':
            return 2;
        case '^':
            return 3;
    }
    return -1;
}

public String infixToPostfix(String expression){
    String result = "";
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < expression.length(); i++){
        char o = expression.charAt(i);
        if(precedence(o) > 0){
            while(stack.isEmpty() == false && precedence(stack.peek()) >= precedence(o)){
                result += stack.pop();
            }
            stack.push(o);

        }else if(o==')'){
            char x = stack.pop();
            while(x!='('){
                result += x;
                x = stack.pop();
            }
            
        }else if(o=='('){
            result += o;
            
        }else{
            result += o;
        }
    }
    for (int i =0; i <= stack.size(); i++){
        result += stack.pop();
    }
    return result;
}

輸入 JButton 代碼:

private void EnterButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                             
    
    // ENTER BUTTON FUNCTION

    String expression = InfixInput1.getText(); 
    if(expression.isEmpty()){
        DisplayInput1.setText("NOTHING TO CONVERT!");
    }else{
        System.out.println("POSTFIX CONVERSION : "+infixToPostfix(expression));
        DisplayInput1.setText(expression);
        PostfixOutput.setText(infixToPostfix(expression));
    }
    PostfixTable.getColumnModel().getColumn(0).setPreferredWidth(5);
    PostfixTable.getColumnModel().getColumn(1).setPreferredWidth(5);
    PostfixTable.getColumnModel().getColumn(2).setPreferredWidth(5);

    String header[] = {"Scanned Symbol","Postfix Stack", "Operator Stack"};
    PostfixTable.setAutoCreateColumnsFromModel(true);
    TableColumn column1 = PostfixTable.getTableHeader().getColumnModel().getColumn(0);
    column1.setHeaderValue(header[0]);

    TableColumn column2 = PostfixTable.getTableHeader().getColumnModel().getColumn(1);
    column2.setHeaderValue(header[1]);

    TableColumn column3 = PostfixTable.getTableHeader().getColumnModel().getColumn(2);
    column3.setHeaderValue(header[2]);
    
    for(int i = 0; i <= expression.length()-1; i++){
        char a = expression.charAt(i);
        DefaultTableModel model = (DefaultTableModel) PostfixTable.getModel();
        model.addRow(new Object[]{a});
    }
}                   

我繼續創建了一個簡單的基本 Swing GUI 來復制您的 GUI。

這是 GUI 的樣子。

在此處輸入圖像描述

您需要處理的代碼位於ConversionListener class 的infixToPostfix方法中。 我不太了解您的轉換代碼,無法在所有正確的位置insertRow方法。

這是完整的可運行代碼。 我將附加類設為內部類,這樣我就可以將代碼作為一個塊發布。

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Stack;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class InfixToPostfixGUI implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new InfixToPostfixGUI());
    }
    
    private final InfixToPostfixModel model;
    
    private JTextField infixField, postfixField;
    
    public InfixToPostfixGUI() {
        this.model = new InfixToPostfixModel();
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Infix to postfix parsing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createDisplayPanel(), BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    private JPanel createDisplayPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        
        panel.add(createInfixPanel(), BorderLayout.NORTH);
        panel.add(createTablePanel(), BorderLayout.CENTER);
        panel.add(createPostfixPanel(), BorderLayout.SOUTH);
        
        return panel;
    }
    
    private JPanel createInfixPanel() {
        JPanel panel = new JPanel(new FlowLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        
        JLabel label = new JLabel("Infix Expression:");
        panel.add(label);
        
        infixField = new JTextField(30);
        panel.add(infixField);
        
        JButton button = new JButton("Enter");
        button.addActionListener(new ConversionListener(this, model));
        panel.add(button);
        
        return panel;
    }
    
    private JPanel createTablePanel() {
        JPanel panel = new JPanel(new FlowLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        
        JTable table = new JTable(model.getTableModel());
        JScrollPane scrollPane = new JScrollPane(table);
        panel.add(scrollPane);
        
        return panel;
    }
    
    private JPanel createPostfixPanel() {
        JPanel panel = new JPanel(new FlowLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        
        JLabel label = new JLabel("Postfix Expression:");
        panel.add(label);
        
        postfixField = new JTextField(30);
        postfixField.setEditable(false);
        panel.add(postfixField);
        
        return panel;
    }
    
    public String getInfixExpression() {
        return infixField.getText().trim();
    }
    
    public void setPostfixExpression() {
        postfixField.setText(model.getPostfixExpression());
    }
    
    public class ConversionListener implements ActionListener {
        
        private final InfixToPostfixGUI view;
        
        private final InfixToPostfixModel model;

        public ConversionListener(InfixToPostfixGUI view, InfixToPostfixModel model) {
            this.view = view;
            this.model = model;
        }

        @Override
        public void actionPerformed(ActionEvent event) {
            String infixExpression = view.getInfixExpression();
            model.setInfixExpression(infixExpression);
            model.setPostfixExpression(infixToPostfix(infixExpression));
            view.setPostfixExpression();
        }
        
        private String infixToPostfix(String expression) {
            removeAllRows(model.getTableModel());
            String result = "";
            Stack<Character> stack = new Stack<>();

            for (int i = 0; i < expression.length(); i++) {
                char o = expression.charAt(i);
                if (precedence(o) > 0) {
                    while (!stack.isEmpty() && precedence(stack.peek()) >= precedence(o)) {
                        String token = Character.toString(stack.pop());
                        insertRow(model.getTableModel(), token, "", "", "", "");
                        result += token;
                    }
                    stack.push(o);

                } else if (o == ')') {
                    char x = stack.pop();
                    while (x != '(') {
                        result += x;
                        x = stack.pop();
                    }

                } else if (o == '(') {
                    String token = Character.toString(o);
                    insertRow(model.getTableModel(), token, "", "", "", "");
                    result += token;

                } else {
                    String token = Character.toString(o);
                    insertRow(model.getTableModel(), token, "", "", "", "");
                    result += token;
                }
            }

            for (int i = 0; i <= stack.size(); i++) {
                String token = Character.toString(stack.pop());
                insertRow(model.getTableModel(), token, "", "", "", "");
                result += token;
            }

            return result;
        }
        
        private int precedence(char o) {
            switch (o) {
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
            case '^':
                return 3;
            default:
                return -1;
            }
        }
        
        private void removeAllRows(DefaultTableModel tableModel) {
            int size = tableModel.getRowCount();
            for (int index = 0; index < size; index++) {
                tableModel.removeRow(0);
            }
        }
        
        private void insertRow(DefaultTableModel tableModel, String token, 
                String action, String result, String stack, String notes) {
            Object[] object = new Object[5];
            object[0] = token;
            object[1] = action;
            object[2] = result;
            object[3] = stack;
            object[4] = notes;
            tableModel.addRow(object);
        }
        
    }
    
    public class InfixToPostfixModel {
        
        private final DefaultTableModel tableModel;
        
        private String infixExpression, postfixExpression;
        
        public InfixToPostfixModel() {
            tableModel = new DefaultTableModel();
            tableModel.addColumn("Token");
            tableModel.addColumn("Action");
            tableModel.addColumn("Result");
            tableModel.addColumn("Stack");
            tableModel.addColumn("Notes");
        }

        public DefaultTableModel getTableModel() {
            return tableModel;
        }

        public String getInfixExpression() {
            return infixExpression;
        }

        public void setInfixExpression(String infixExpression) {
            this.infixExpression = infixExpression;
        }

        public void setPostfixExpression(String postfixExpression) {
            this.postfixExpression = postfixExpression;
        }

        public String getPostfixExpression() {
            return postfixExpression;
        }
        
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM