shadow0981 Ответов: 1

Как вставить 2 цифры или более в стек (функция инфикса в постфикс включена)


Мне поручено сделать калькулятор, который вычисляет и преобразует уравнение из инфикса в постфикс при использовании стека (функции push, pop).
Я закончил большую часть кода (он работает, но все еще нуждается в некоторой работе)

но я понятия не имею, как заставить его нажать 2 или более цифр в стеке и оценить их следующим образом 234+15*12


#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <ctype.h>



int InfixToPostfix();
void push(char);
char pop();
void calculate();
int priority(char);
char stack[20];
int top=-1;
char postfix[20];

int main()
{
	while(1)
		calculate();
	getch();
	return 0;
}

int InfixToPostfix()
{	
	char infix[20],ch;
	int k=0,size;
    printf("----------------------------------------------\nPlease enter the value you wish to calculate\n");
	gets(infix);
	size=strlen(infix);
	for(int i =0;i<size;i++)
	{
		ch=infix[i];
		if(isdigit(ch))
			postfix[k++]=ch;
		else if(ch=='(')
			push(ch);
		else if (ch==')')
		{
			while((stack[top] != '('))
				postfix[k++]= pop();
			char remove = pop();
		}
		else 
		{
			while(priority(stack[top]) >= priority(ch))
				postfix[k++]=pop();
			   push(ch);
		}
	}
	while(top != -1)
		postfix[k++]=pop();
	    postfix[k] = '\0'; 
        printf("\nGiven Infix Expn: %s  Postfix Expn: %s\n", infix, postfix);
		return postfix[k];
}

void push(char x)
{
	stack[++top]=x;
}

char pop()
{
	return stack[top--];
}
void calculate()
	{
		int i=0;
		int op1,op2;
		char z;
		InfixToPostfix();
		do{

		    z=postfix[i++];
			if(isdigit(z))
				push(z - 48); 
				

			else{
	    switch(z)
	  {
	    case '+':
			op1=pop();
	        op2=pop();
	        
	        push(op2+op1);
	        break;

	    case '-':

	        op1=pop();
	        op2=pop();
	        
	        push(op2-op1);
	        break;

	    case '*':

	        op1=pop();
	        op2=pop();
	        
	        push(op2*op1);
	        break;

	    case '/':
			
	        op1=pop();
	        op2=pop();
	        
	        push(op2/op1);
	        break;
		case '^':
		    op1=pop();
			op2=pop();
			push((int)pow((double)op2,op1));
			break;
	      }
    	}
	}while(z != '\0');
		 
  printf("\n Result after Evaluation: %d\n", stack[top]);
}

int priority(char x)
{
	if(x=='(')
		return 0;
	if(x== '+'|| x=='-')
		return 1;
	if(x=='*' || x=='/')
		return 2;
	if(x=='^')
	return 3;
	return -1;
	
}


Что я уже пробовал:

Смотрю в интернете наверное

PIEBALDconsult

Может быть, прочитать несколько статей, чтобы получить идеи.
Возможно, даже мое: https://www.codeproject.com/Articles/12804/A-Simple-Infix-to-Reverse-Polish-Notation-Transfor

1 Ответов

Рейтинг:
2

OriginalGriff

Вы не нажимаете цифры: вы преобразуете их в числа и нажимаете их.
По сути, то, что вы делаете, - это "маркировка" пользовательского ввода:

234+15*12
Будет 5 жетонов:
Number  :  234
Operator:    +
Number  :   15
Operator:    *
Number  :   12
Итак, есть пять предметов, которые вы должны поместить в свой стек.
Взгляните на это: 3.9. Инфиксные, префиксные и Постфиксные выражения-решение задач с помощью алгоритмов и структур данных[^]- он показывает алгоритм обработки этого после того, как вы маркировали входные данные.