2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Содержимое стека(С)
Сообщение25.03.2013, 15:32 


22/12/12
54
Написал программу, но есть одна проблема. На некоторых этапах надо записать содержимое стека в файл. Вот код:
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Заслуженный участник


27/04/09
28128
Вы при выводе стек разрушаете. А ниже по коду собрались что-то в нём искать. В пустом.

 Профиль  
                  
 
 Re: Содержимое стека(С)
Сообщение26.03.2013, 08:03 


22/12/12
54
Да я понял, что у меня в этом ошибка, но я прошу помощи в написании програмы таким образом, чтобы стек не разрушался

 Профиль  
                  
 
 Re: Содержимое стека(С)
Сообщение26.03.2013, 16:13 
Заслуженный участник


27/04/09
28128
При условии
StopCry в сообщении #701163 писал(а):
Вывод стека должен быть реализован на базовых операциях(создание, взять, положить, проверить на пустоту)
вам поможет другой стек или рекурсивный вызов outputStack.

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

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

(Оффтоп)

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

 Профиль  
                  
 
 Re: Содержимое стека(С)
Сообщение26.03.2013, 16:43 


22/12/12
54
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 
Заслуженный участник


27/04/09
28128
Да, так сойдёт.

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

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

 Профиль  
                  
 
 Re: Содержимое стека(С)
Сообщение26.03.2013, 17:59 


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

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

 Профиль  
                  
 
 Re: Содержимое стека(С)
Сообщение26.03.2013, 19:01 
Заслуженный участник


27/04/09
28128
Достаточно, чтобы второй стек хранил те элементы, которые были в первом, но сейчас их извлекли из него. Дополнительная память для этого — константа от числа элементов стека; это нормально.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group