Prepis výrazu z infixu do postfix-u – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Prepis výrazu z infixu do postfix-u – C / C++ – Fórum – Programujte.comPrepis výrazu z infixu do postfix-u – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Kent0
Stálý člen
27. 9. 2014   #1
-
0
-

Ahojte, mám problém s kódom na prepis výrazu z infixového tvaru do postfixového. Spraví mi to pre jeden riadok ale keď mám viacriadkový vstup tak už vypíše hlúposti. Za každú radu ďakujem.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct zasobnik
{
	int data[10000];				//pole pre pismenka a operatori ktore budem davat do zasobnika
	int vrch;					//vrch zasobnika
}zasobnik;

char vrch(zasobnik *s);
int priorita(char);
int je_prazdny(zasobnik *s);
char vyber(zasobnik *s);
void vloz(zasobnik *s, char x);
int je_plny(zasobnik *s);
void inicializacia(zasobnik *s);

int main()
{
	zasobnik s;
	char x;
	int c;
  	inicializacia(&s);				//inicializacia vrchu zasobnika
	while ((c = getchar()) > 0)
	{
     
      	if (c >= 'A' && c <= 'Z')		//ak je to pismeno tak ho vypise
			printf("%c", c);
		else
			if (c == '(')				//ak je to lava zatvorka tak vlozi do zasobnika
				vloz(&s, '(');
			else
			{
				if (c == ')')			//ak je to prava zatvorka tak..
					while ((x = vyber(&s)) != '(')	//..sa vybera zo zasobnika kym nenarazi na pravu zatvortku
						printf("%c", x);
				else					//ak je to operator
				{
					while (priorita(c) <= priorita(vrch(&s)) && je_prazdny(&s) != 1)	//porovna sa priorita operatoru
					{
						x = vyber(&s);
						printf("%c", x);
					}
					vloz(&s, c);		//vlozenie operatoru
				}
			}
        
      }
    
  	
    while(je_prazdny(&s) != 1)		//vyprazdnenie zasobnika
	{
		x = vyber(&s);
		printf("%c", x);
     }
  
	getchar();
	getchar();
	return 0;
}
int priorita(char x)
{
  int von;
	if (x == '(')
		von = 0;
	if (x == '+' || x == '-')			//mensia priorita vrati 1
		von = 1;
	if (x == '*' || x == '/' )		//vacsia priorita vrati 2
		von = 2;
	return von;
}
void inicializacia(zasobnik *s)
{
	s->vrch = -1;
}

int je_prazdny(zasobnik *s)
{
	if (s->vrch == -1)				//na zaciatku bol inicializovany na -1 
		return(1);
	else
		return(0);
}

void vloz(zasobnik *s, char x)
{
	s->vrch = s->vrch + 1;				//posuniem vrch a
	s->data[s->vrch] = x;				//zapisem znak
}

char vyber(zasobnik *s)
{
	int x;
	x = s->data[s->vrch];				//do x aktualny znak z vrchu zasobnika
	s->vrch = s->vrch - 1;				//posuniem vrch o
	return(x);
}

char vrch(zasobnik * s)
{
	return(s->data[s->vrch]);			//vrati znak ktory je na vrchu zasobnika
}
Nahlásit jako SPAM
IP: 147.175.176.–
Reklama
Reklama
vitamin+8
Grafoman
28. 9. 2014   #2
-
0
-

Aky ocakavas vstup a aky vystup?

Toto ti funguje? :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>


typedef struct zasobnik
{
	int data[10000];				//pole pre pismenka a operatori ktore budem davat do zasobnika
	int vrch;					//vrch zasobnika
}zasobnik;

char vrch(zasobnik *s);
int priorita(char);
int je_prazdny(zasobnik *s);
char vyber(zasobnik *s);
void vloz(zasobnik *s, char x);
int je_plny(zasobnik *s);
void inicializacia(zasobnik *s);

int main()
{
	zasobnik s;
	char x;
	int c;
  	inicializacia(&s);				//inicializacia vrchu zasobnika
	while ((c = getchar()) > 0)
	{
     
      	if (c >= 'A' && c <= 'Z')		//ak je to pismeno tak ho vypise
			printf("%c", c);
		else
			if (c == '(')				//ak je to lava zatvorka tak vlozi do zasobnika
				vloz(&s, '(');
			else
			{
				if (c == ')')			//ak je to prava zatvorka tak..
					while ((x = vyber(&s)) != '(')	//..sa vybera zo zasobnika kym nenarazi na pravu zatvortku
						printf("%c", x);
				else					//ak je to operator
				{
					while (priorita(c) <= priorita(vrch(&s)) && je_prazdny(&s) != 1)	//porovna sa priorita operatoru
					{
						x = vyber(&s);
						printf("%c", x);
					}
					vloz(&s, c);		//vlozenie operatoru
				}
			}
        
      }
    
  	
    while(je_prazdny(&s) != 1)		//vyprazdnenie zasobnika
	{
		x = vyber(&s);
		printf("%c", x);
     }
  
	getchar();
	getchar();
	return 0;
}


int priorita(char x){
	switch(x){
		case '(':
			return 0;
			
		case '+':
		case '-':
			return 1;
		
		case '*':
		case '/':
			return 2;
			
	}
	
	assert(0);
}

int je_prazdny(zasobnik *s){
	assert(s);
	return s->vrch == -1;
}

void inicializacia(zasobnik *s){
	assert(s);
	s->vrch = -1;
}

void vloz(zasobnik *s, char x){
	assert(s);
	assert(s->vrch >= -1);	
	assert((s->vrch+1) < (int)(sizeof(s->data)/sizeof(int)));
	
	s->vrch++;
	s->data[s->vrch] = x;				//zapisem znak
}

char vyber(zasobnik *s){
	assert(s);
	assert(s->vrch >= 0);
	assert(s->vrch < (int)(sizeof(s->data)/sizeof(int)));
	
	char x = s->data[s->vrch];
	s->vrch--;
	return x;
}

char vrch(zasobnik * s){
	assert(s);
	assert(s->vrch >= 0);
	assert(s->vrch < (int)(sizeof(s->data)/sizeof(int)));
	
	return s->data[s->vrch];			//vrati znak ktory je na vrchu zasobnika
}
Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kent0
Stálý člen
28. 9. 2014   #3
-
0
-

#2 vitamin
vstup má byť niekoľko riadkov infixových výrazov..
ale už som to vyriešil :) zmenil som spôsob načítania a pridal ďalší while cyklus..

 

while ((scanf("%s",vstup)) >0)
	{
		i = 0;
		while (i < strlen(vstup)){
		vstup[i]... a tak ďalej
Nahlásit jako SPAM
IP: 147.175.176.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 85 hostů

Podobná vlákna

POSTFIX,chyba v programe — založil bbeni

Umocnění výrazu — založil zdenek

Vyhodnotenie prijateho vyrazu — založil Tom@sQo

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý