2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Содержимое стека(С)
Сообщение25.03.2013, 15:32 
Написал программу, но есть одна проблема. На некоторых этапах надо записать содержимое стека в файл. Вот код:
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
FILE *f1,*fstack;

struct duck{ //сама структура
    char el;
    duck *next;};

int pust(duck * p)//проверка на пустоту
{
  if (p == NULL)
      return 1;
  else
      return 0;
}

duck *add(duck *p, char x)//добавление элемента в стек
{
                if (pust(p) == 1)
        {
                p = new duck;
                p->el = x;
                p->next = NULL;
                return p;
        }
        else
        {
                        duck *s;//s and p = first elem
                        s = new duck;
                        s->el = x;
                        s->next = p;
                        return s;
        }
        }

char inX(FILE *f1)//ввод переменной
{
        int c;
        fscanf(f1,"%c",&c);
        return c;
}

duck *out (duck *p)//взять из стека
{
        if(pust(p) == 0)
        {
                duck *s = p;
                p = p->next;
                s->next = NULL;
                return p;
        }
}

int find(duck * p, char x)//найти элемент в стеке
{
        int answer;
        if (pust(p) == 1)
                return 0;
        else
        {
                if (p->el == x)
                        return 1;
                else
                {
                        p = out(p);
                        answer = find(p,x);
                }
        }
}
void main()
{
        duck *p = NULL;
        f1 = fopen("input.txt","r");
        char c;
        fscanf(f1,"%c",&c);
        while(c !='.')
        {
                p = add(p,c);
                /*вот здесь должен быть вывод*/
                fscanf(f1,"%c",&c);
        }
        fclose(f1);
        f1 = fopen("char.txt","r");
        char x = inX(f1);
        int answer = find(p,x);
        f1 = fopen("output.txt","w");
        fprintf(f1,"%d",answer);
        fclose(f1);
}
 

Вывод стека должен быть реализован на базовых операциях(создание, взять, положить, проверить на пустоту)
У меня есть программа вывода стека на экран, но она выводит только 2 последних элемента
Используется синтаксис C
void outputStack(duck *p)
{
        while (p != NULL)
        {
                fprintf(fstack,"%c", p->el);
                p = out(p);
        }
}

то есть на стек 123, она должна по идее была вывести 1,21,321... а она выводит 1,21,32, для большего количества элементов аналогично поступает, то есть выводит только 2 верхних элемента из стека

 
 
 
 Re: Содержимое стека(С)
Сообщение25.03.2013, 20:01 
Вы при выводе стек разрушаете. А ниже по коду собрались что-то в нём искать. В пустом.

 
 
 
 Re: Содержимое стека(С)
Сообщение26.03.2013, 08:03 
Да я понял, что у меня в этом ошибка, но я прошу помощи в написании програмы таким образом, чтобы стек не разрушался

 
 
 
 Re: Содержимое стека(С)
Сообщение26.03.2013, 16:13 
При условии
StopCry в сообщении #701163 писал(а):
Вывод стека должен быть реализован на базовых операциях(создание, взять, положить, проверить на пустоту)
вам поможет другой стек или рекурсивный вызов outputStack.

Это условие очень странное. Вывод стека — его личное дело, и неуместно запрещать использовать в нём его внутреннюю структуру явно.

-- Вт мар 26, 2013 19:20:08 --

(Оффтоп)

Кстати, решительно не понимаю, чем такая структура кода лучше использования ещё одной struct под именем, например, Stack, с методами (у которых при этом были бы более-менее общепринятые имена). C ведь совсем не обязывает отделять операции над структурой данных от её представления.

 
 
 
 Re: Содержимое стека(С)
Сообщение26.03.2013, 16:43 
arseniiv в сообщении #701647 писал(а):

(Оффтоп)

Кстати, решительно не понимаю, чем такая структура кода лучше использования ещё одной struct под именем, например, Stack, с методами (у которых при этом были бы более-менее общепринятые имена). C ведь совсем не обязывает отделять операции над структурой данных от её представления.

А можете хоть маленько пояснить это? или хотя бы намекнуть, где это искать?

-- 26.03.2013, 19:47 --

я вот таким образом реализовал, но не уверен, что это именно то, что нужно.
Используется синтаксис C
void outputStack(duck *p)
{

        fprintf(fstack,"%c", p->el);
                if (p->next != NULL)
                        outputStack(p->next);  
}
 

просто я не хочу использовать второй стек, т.к. это означает 2х кратное использование памяти

 
 
 
 Re: Содержимое стека(С)
Сообщение26.03.2013, 17:21 
Да, так сойдёт.

StopCry в сообщении #701666 писал(а):
просто я не хочу использовать второй стек, т.к. это означает 2х кратное использование памяти
Не означает.

StopCry в сообщении #701666 писал(а):
А можете хоть маленько пояснить это? или хотя бы намекнуть, где это искать?
Если от вас этого не требуют, нет смысла.

 
 
 
 Re: Содержимое стека(С)
Сообщение26.03.2013, 17:59 
arseniiv в сообщении #701682 писал(а):
StopCry в сообщении #701666 писал(а):
просто я не хочу использовать второй стек, т.к. это означает 2х кратное использование памяти
Не означает.

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

 
 
 
 Re: Содержимое стека(С)
Сообщение26.03.2013, 19:01 
Достаточно, чтобы второй стек хранил те элементы, которые были в первом, но сейчас их извлекли из него. Дополнительная память для этого — константа от числа элементов стека; это нормально.

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group