Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[Zadatak] Struktura STACK, logički izraz iz infix oblika u postfix oblik

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Struktura STACK, logički izraz iz infix oblika u postfix oblik

[ Pregleda: 1713 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

fluox
zg

Član broj: 163404
Poruke: 2
*.sava.sczg.hr.



Profil

icon [Zadatak] Struktura STACK, logički izraz iz infix oblika u postfix oblik19.11.2007. u 07:53 - pre 199 meseci
prvo, ja sam los programer. zapravo, ja uopce nisam programer i s programiranjem ne bih imala nikakve veze da to fax ne zahtijeva. i eto, sad sam provela cijelu noc rjesavajuci zadatak koji sam dobila za zadacu i vise stvarno ne znam sto bih s njim. program se uredno kompajlira, ne javlja nikakve greske. kao ulaz prima logicki izraz u infix obliku koji bi zatim trebao ispisati u postfix obliku. ali moj program ne ispisuje postfix oblik, vec se samo zatvori (kao da sam npr. izostavila scanf("%%")). i tako, meni je ponestalo ideja i zivaca, pa ako netko ima dovoljno dobro volje da mi pomogne, unaprijed sam zahvalna.

Code:
/*Implementirajte a.t.p. STACK pomoću pointera i napišite potprogram koji 
logički izraz iz infix oblika prebacuje u postfix oblik. Problem trebate 
riješiti pomoću stoga.


Ulazni podaci: string koji predstavlja logički izraz u infix obliku
Izlazni podaci: prikaz istog izraza u postfix obliku
Na primjer, za ulazne podatke:
A|B&(C^E|D)
treba ispisati:
ABCE^D|&|
Napomena: &=AND, |=OR, ^=XOR, -=NOT; obratite pažnju na prioritete */

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

#define Operator (-10)
#define Operand (-20)
#define Lijeva (-30)
#define Desna (-40)

typedef char elementtype;

typedef struct _celltype {
        elementtype element;
        struct _celltype *next;
} celltype;

typedef celltype *STACK;

void error(char s[255]){
     printf("%s", s); exit(1);
}

void MAKE_NULL(STACK *S){
     *S=NULL;
}

int EMPTY(STACK S){
    if(S==NULL) return 1;
    return 0;
}

void PUSH(elementtype x, STACK *S){
     celltype *novi=(celltype *)malloc(sizeof(celltype));
     novi->element=x;
     novi->next=*S;
     *S=novi;
}

elementtype TOP(STACK S){
            if(EMPTY(S)) error("Stog je antipun.");
            return S->element;
}


void POP(STACK *S){
      if(EMPTY(*S)) error("Stog je antiprazan.");
      celltype *temp=*S;
      *S=temp->next;
      free(temp);


int nadji_tip(char c)
{
          if ((c=='&')||(c=='-')||(c=='^')||(c=='|'))
                return Operator;
        if (c=='(')
                return Lijeva;
        if (c==')')
                return Desna;
        else
            return Operand;
 }

int prioritet(char c)
{
           if (c=='&') 
                return 2;
          if (c=='-')
                return 3;
          if (c=='|')
                return 1;
          if (c=='^')
                return 1;
}

int main(){
    char infix[20], postfix[20];
    int len, tip, i, p=0;
    STACK pom;
    MAKE_NULL(&pom);
    printf ("Unesi izraz.\n");
    scanf ("%s",&infix);
    len=strlen(infix);
    for (i=0; i<len; i++){
          tip=nadji_tip(infix[i]);
          if (tip==Lijeva) PUSH( infix[i], &pom );
          if (tip==Desna){ while ( (TOP(pom)) != '(' ){ 
                       postfix[p++] = TOP(pom);
                       POP(&pom);}}
          if (tip==Operand) postfix[p++] = infix[i];
          if (tip==Operator) {
                             if (EMPTY(pom)==1) PUSH (infix[i], &pom);
                             while (prioritet(infix[i]) <= prioritet(TOP(pom))){
                                   postfix[p++]=TOP(pom);
                                   POP(&pom);}
                             if (prioritet(infix[i])>prioritet(TOP(pom)))
                                postfix[p++]=infix[i];
                             }}
                         
          while (EMPTY(pom)!= 1){postfix[p++]=TOP(pom);
                             POP(&pom);}
          printf ("Izlaz: %s", postfix);
          scanf("%%");
          return 0;
}



p.s. nemojte se smijati mojim if-ovima =)
 
Odgovor na temu

rumpl

Član broj: 54959
Poruke: 156
*.net81-66-198.noos.fr.



Profil

icon Re: [Zadatak] Struktura STACK, logički izraz iz infix oblika u postfix oblik19.11.2007. u 12:02 - pre 199 meseci
Kod mene ovo radi:

Code:

/*Implementirajte a.t.p. STACK pomo?u pointera i napi?ite potprogram koji 
logi?ki izraz iz infix oblika prebacuje u postfix oblik. Problem trebate 
rije?iti pomo?u stoga.


Ulazni podaci: string koji predstavlja logi?ki izraz u infix obliku
Izlazni podaci: prikaz istog izraza u postfix obliku
Na primjer, za ulazne podatke:
A|B&(C^E|D)
treba ispisati:
ABCE^D|&|
Napomena: &=AND, |=OR, ^=XOR, -=NOT; obratite pa?nju na prioritete */

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

#define Operator (-10)
#define Operand (-20)
#define Lijeva (-30)
#define Desna (-40)

typedef char elementtype;

typedef struct _celltype 
{
  elementtype element;
  struct _celltype *next;
} celltype;

typedef celltype *STACK;

void error(char s[255])
{
  printf("%s", s); 
  exit(1);
}

void MAKE_NULL(STACK *S)
{
  *S = NULL;
}

int EMPTY(STACK S)
{
  if(S == NULL) 
    return 1;

  return 0;
}

void PUSH(elementtype x, STACK *S)
{
  celltype *novi = (celltype *)malloc(sizeof(celltype));
  novi->element = x;
  novi->next = *S;
  *S = novi;
}

elementtype TOP(STACK S)
{
  if(EMPTY(S)) 
    error("Stog je antipun.");
  
  return S->element;
}


void POP(STACK *S)
{
  if(EMPTY(*S)) 
    error("Stog je antiprazan.");
    
  celltype *temp = *S;
  *S = temp->next;
  free(temp);


int nadji_tip(char c)
{
  if ((c == '&') || (c == '-') || (c == '^') || (c == '|'))
    return Operator;
  if (c == '(')
    return Lijeva;
  if (c == ')')
    return Desna;
  else
    return Operand;
}

int prioritet(char c)
{
  if (c == '&') 
    return 2;
  if (c == '-')
    return 3;
  if (c == '|')
    return 1;
  if (c == '^')
    return 1;
}

int main()
{
  char infix[20], postfix[20];
  int len, tip, i, p = 0;
  
  STACK pom;
  MAKE_NULL(&pom);
  
  printf ("Unesi izraz.\n");
  scanf ("%s", infix);

  len = strlen(infix);
  
  for (i = 0; i < len; i++)
    {
      tip = nadji_tip(infix[i]);

      if (tip == Lijeva) 
    {
      PUSH( infix[i], &pom );
    }
      
      if (tip == Desna)
    { 
      while (!EMPTY(pom) && (TOP(pom)) != '(' )
        { 
          postfix[p++] = TOP(pom);
          POP(&pom);
        }

      if(!EMPTY(pom))
        POP(&pom);
    }
      
      if (tip == Operand) 
    {
      postfix[p++] = infix[i];
    }
      
      if (tip == Operator) 
    {
      while ( !EMPTY(pom) && TOP(pom) != '(')
        {
          if(prioritet(infix[i]) <= prioritet(TOP(pom)))
        {
          postfix[p++] = TOP(pom);
          POP(&pom);
        }
          else
        {
          break;
        }
        }

      PUSH(infix[i], &pom);
    }
    }
  
  while (EMPTY(pom) != 1)
    {
      postfix[p++] = TOP(pom);
      POP(&pom);
    }
  
  printf ("Izlaz: %s\n", postfix);
  
  scanf("%%");
  
  return 0;
}



Samo ti je deo za Operator bio los.
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
 
Odgovor na temu

fluox
zg

Član broj: 163404
Poruke: 2
*.dsl.optinet.hr.



Profil

icon Re: [Zadatak] Struktura STACK, logički izraz iz infix oblika u postfix oblik19.11.2007. u 13:30 - pre 199 meseci
e, hvala, sad sve stima =)
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Struktura STACK, logički izraz iz infix oblika u postfix oblik

[ Pregleda: 1713 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.