Shrimad Mishra Ответов: 4

В чем заключается ошибка в следующем коде?


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

struct stack
{
    char data;
    struct stack * next;
};

struct stack * createstack()
{
 struct stack * s;
 s=(struct stack*)malloc(sizeof(struct stack));
 return s;
}

void push(struct stack * s,char data)
{
    struct stack * p;
    p=createstack();
    p->data=data;
    p->next=NULL;
    if(s==NULL)
    {
        s=p;
        return ;
    }
    p->next=s;
    s=p;
}

char pop( struct stack * s)
{
    struct stack * p;
    p=s;
    char d;
    d=p->data;
    s=p->next;
    free(p);
    return d;
}

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

int isaplpha(char x)
{
  if((x>='A' || x>='a')&&(x>='Z' || x>='z' ))
    return 1;
  return 0;
}

int main()
{
    char * c;
    char s[20],x[20],d;
    int j=0;
    struct stack * head;
    head=NULL;
    printf("Enter the expression to convert it into postfix \n");
    gets(s);
    c=&s[0];
    while(*c!='\0')
    {
        if(isaplpha(*c))
           x[j++]=*c;
        else if(*c=='(')
            push(head,*c);
        else if(*c==')')
        {
                d=pop(head);
            while(d!='(')
            {
                d=pop(head);
                x[j++]=d;
            }
            push(head,*c);
        }
        else
        {
            while(prec(head->data)>=prec(*c))
                x[j++]=pop(head);
            push(head,*c);
        }
        c++;
    }
    while(head!=NULL)
    {
        x[j++]=pop(head);
        head=head->next;
    }
    puts(x);
    return 0;
}


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

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

struct stack
{
    char data;
    struct stack * next;
};

struct stack * createstack()
{
 struct stack * s;
 s=(struct stack*)malloc(sizeof(struct stack));
 return s;
}

void push(struct stack * s,char data)
{
    struct stack * p;
    p=createstack();
    p->data=data;
    p->next=NULL;
    if(s==NULL)
    {
        s=p;
        return ;
    }
    p->next=s;
    s=p;
}

char pop( struct stack * s)
{
    struct stack * p;
    p=s;
    char d;
    d=p->data;
    s=p->next;
    free(p);
    return d;
}

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

int isaplpha(char x)
{
  if((x>='A' || x>='a')&&(x>='Z' || x>='z' ))
    return 1;
  return 0;
}

int main()
{
    char * c;
    char s[20],x[20],d;
    int j=0;
    struct stack * head;
    head=NULL;
    printf("Enter the expression to convert it into postfix \n");
    gets(s);
    c=&s[0];
    while(*c!='\0')
    {
        if(isaplpha(*c))
           x[j++]=*c;
        else if(*c=='(')
            push(head,*c);
        else if(*c==')')
        {
                d=pop(head);
            while(d!='(')
            {
                d=pop(head);
                x[j++]=d;
            }
            push(head,*c);
        }
        else
        {
            while(prec(head->data)>=prec(*c))
                x[j++]=pop(head);
            push(head,*c);
        }
        c++;
    }
    while(head!=NULL)
    {
        x[j++]=pop(head);
        head=head->next;
    }
    puts(x);
    return 0;
}

jeron1

Расскажите нам, что вы пытаетесь сделать (ожидаемые входы и выходы) и что ваша программа делает не то, что вы хотите. Попробуйте сузить его до раздела кода, если сможете. Не так уж много людей будут проходить строчку за строчкой через ваш код, чтобы диагностировать его. Чем больше деталей, тем лучше, и задавайте конкретные вопросы.

4 Ответов

Рейтинг:
7

CPallini

Я приведу вам пример реализации стека (вместе с примером его использования):

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

//-> stack
struct stack
{
  char data;
  struct stack * down;
};

// pushes an item, returning pointer to it ( new TOP of the stack)
struct stack  * push(struct stack * top, char data)
{
  struct stack * newtop = (struct stack *) malloc( sizeof (struct stack) );
  assert(newtop);
  newtop->data = data;
  newtop->down = top;
  return newtop;
}

// pops (removes) the TOP item, returning the pointer to the new TOP
struct stack * pop( struct stack * top)
{
  if ( ! top ) return NULL;
  struct stack * newtop = top->down;
  free( top);
  return newtop;
}
//<- 

int main()

  const char * s = "Hello World!";
  struct stack * top = NULL;
  while ( *s )
  {
    top = push( top, *s);
    ++s;
  }

  while (top)
  {
    putchar(top->data);
    top = pop(top);
  }
  putchar('\n');
  return 0;
}


Обратите внимание, что используемая стратегия распределения памяти неэффективна. Для instace с глубокими штабелями, готовое Класс стека C++ [^] (использование стратегии выделения памяти STL контейнеры) намного быстрее.


Maciej Los

Интересный образец ;)

Рейтинг:
2

Rick York

Этот код неверен :

int isaplpha(char x)
{
  if((x>='A' || x>='a')&&(x>='Z' || x>='z' ))
    return 1;
  return 0;
}
Во-первых, существует функция RTL, которая действительно выполняет тест isalpha. Нет никакой необходимости писать его для себя. Вы уже используете RTL с malloc, поэтому его использование не должно быть проблемой. Во-вторых, чтобы сделать это правильно, нужно написать что-то вроде этого :
int isalpha(char x)
{
   return ( ( x >= 'A' && x <='Z') || ( x >='a' && x <= 'z' ) );
}
Я не уверен, что такое ispalpha, поэтому я написал его isalpha. Однако это может столкнуться с именем функции RTL, поэтому вам лучше просто использовать функцию RTL.


Shrimad Mishra

я пробовал, но выход не приходит

Stefan_Lang

Вы говорите, что никакого вывода вообще нет, то есть программа не останавливается? Если да, то, возможно, ваш вклад слишком велик.

Рейтинг:
14

Patrice T

Цитата:
Какая погрешность в следующем коде

Проблема в том, что вы не сказали нам, что этот код должен делать, а что не так, как ожидалось.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Stefan_Lang

Каким бы общим ни был этот совет, он, вероятно, применим к этой проблеме больше, чем большинство других. По крайней мере, одна из основных проблем (см. Решение 2) могла быть легко обнаружена с помощью отладчика.

Есть 5.

Patrice T

Спасибо

Рейтинг:
1

Xanith

Проверьте свои методы push и pop. Переданный указатель не будет изменен в вызывающем методе. Вам нужно будет использовать указатель на указатель или передать указатель по ссылке.


Stefan_Lang

Правильно, это то, что я также отметил. head всегда будет оставаться на нуле внутри main(). Мой 5.