Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///////////// Stack
- public class Stack<T> {
- private Node top; //голова стэка
- private int size; //размер стэка
- public Stack() { //конструктор
- this.top = null;
- size=0;
- }
- private boolean isEmpty(){
- return top==null;
- } //проверка стэка на пустоту
- public int getSize() { //геттер размера
- return size;
- }
- public T getTop() { //получить головной элемент
- return (T)top.memory;
- }
- public void push(T el){ //добавление элемента в начало стэка
- Node node=new Node(el);
- if(isEmpty()){
- top=node;
- size++;
- }
- else{
- node.next=top;
- top=node;
- size++;
- }
- }
- public void pop(){ //удаление головы стэка
- if(!isEmpty()){
- if(top.next!=null){
- top=top.next;
- size--;
- }
- else{
- top=null;
- size--;
- }
- }
- }
- }
- ///////////// Node
- public class Node<T> { //узел стэка
- public T memory; //данные узла
- public Node next; //ссылка на следующий элемент
- public Node(T memory) {
- this.memory = memory;
- }
- }
- ///////////////// Main
- public class Main {
- public static void main(String[] args) {
- boolean prov=false;
- Stack<String > polska=new Stack(); //Стэк используемый для обратной польской нотации
- String primer="12*0.2*3-15/(0.3*3+6*0.4)"; //данное выражение
- String[] exp=primer.split("");
- String numbers_="1234567890.";
- String[] numbers=numbers_.split(""); //строка с числами
- String op="/*+-(";
- String[] operands=op.split(""); //строка с операндами
- String polskaStr="";//строка для обратной польской нотации
- Stack<Double> calculat=new Stack<>(); //стэк для вычисление польской нотации
- String str="";
- System.out.println("Исходное выражение: "+primer); // выводим исходное выражение
- //запись обратной польской нотации
- for(int i=0;i<exp.length;i++){
- for(int j=0;j<operands.length;j++) {
- //проверка символа на операнд
- if(exp[i].equals(operands[j])){
- if (exp[i].equals("-")||exp[i].equals("+")) {
- int size = polska.getSize();
- for(int k=0;k<size;k++){
- String top=(String) polska.getTop();
- if(top.equals("(")){
- continue;
- }
- polskaStr=String.format("%s%s",polskaStr,top);
- polska.pop();
- }
- String top=exp[i];
- polska.push(top);
- prov=true;
- break;
- }
- String top=exp[i];
- polska.push(top);
- prov=true;
- break;
- }
- }
- //проверка символа на число
- for(int j=0;j<numbers.length;j++){
- if(exp[i].equals(numbers[j])){
- if(prov){
- polskaStr=String.format("%s%s",polskaStr," ");
- prov=false;
- }
- String top=exp[i];
- polskaStr=String.format("%s%s",polskaStr,top);
- }
- }
- if(exp[i].equals(")")){
- int razm=polska.getSize();
- for(int j=0;j< razm;j++){
- String rop=(String) polska.getTop();
- if(rop.equals("(")){
- polska.pop();
- break;
- }
- polskaStr=String.format("%s%s",polskaStr,rop);
- polska.pop();
- }
- }
- }
- int razm=polska.getSize();
- for(int k=0;k<razm;k++){
- String top=(String) polska.getTop();
- polskaStr=String.format("%s%s",polskaStr,top);
- polska.pop();
- }
- System.out.println("Обратная польская нотация: "+polskaStr); //вывод обратной польской нотации
- String[] polishNotation=polskaStr.split("");
- //вычисление выражения с помощью
- for (int i=0;i<polishNotation.length;i++){
- if(polishNotation[i].equals(" ")){
- continue;
- }
- for(int k=0;k<numbers.length;k++){
- if(polishNotation[i].equals(numbers[k])){
- str=str+polishNotation[i];
- if(polishNotation[i+1].equals(" ")||
- polishNotation[i+1].equals("+")||
- polishNotation[i+1].equals("-")||
- polishNotation[i+1].equals("/")||
- polishNotation[i+1].equals("*")){
- double num=Double.parseDouble(str);
- calculat.push(num);
- str="";
- }
- }
- }
- for(int j=0;j<operands.length;j++){
- if(polishNotation[i].equals(operands[j])){
- double a=(double)calculat.getTop();
- calculat.pop();
- double b=(double)calculat.getTop();
- calculat.pop();
- if (polishNotation[i].equals("-"))
- calculat.push(b - a);
- if (polishNotation[i].equals("+"))
- calculat.push(b+a);
- if (polishNotation[i].equals("*"))
- calculat.push(b*a);
- if (polishNotation[i].equals("/"))
- calculat.push(b/a);
- }
- }
- }
- System.out.println("Результат вычисления: "+calculat.getTop());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement