Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Реализация стека и очереди, проверьте пожалуйста, код.  
V
    Опции темы
DiNeo
  Дата 8.4.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



Здравствуйте!
Учусь писать программы на  Visual Studio 2008.
Написал программу на C++ для решения задания :    Используя стек, переписать содержимое текстового файла, разделенного на строки,  в другой файл. Причем, необходимо переносить в конец каждой строки все входящие в нее цифры в обратном порядке. 
Программа реализует стек и очередь. Т.е. в стек заносятся цифры, а в очередь буквы. 
Т.е. на входе у меня строки:
egfre5241regtr5g2erg
erg5tyh2j
На выходе должно быть:
egfreregtrgerg251425
ergtyhj25
Код

#include "iostream" 
#include <string.h> 
#include <conio.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include "windows.h" 
#include "iomanip" 
using namespace std; 
struct stack
{ 
    char d; 
    stack*next; 
}; 

struct Node
{    char d;
    Node *p;
};

// 3aнeceние в стек 
void push (char d, stack**top) 
{ 
stack*pv = new stack; 
pv->d = d; 
pv->next = *top; 
*top = pv; 
} 
// 3aнeceние в очередь 
void add (char d, Node **pend) 
{ 
Node*pv = new Node; 
pv->d = d; 
(*pend)->p = pv;
*pend = pv;
} 

 
// Выборка из стека 
void pop (stack**top) 
{  
stack *pv= *top; 
*top=(*top)->next;
delete pv; 
}

// Выборка из очереди 
void del (Node **pbeg) 
{  
Node *pv = *pbeg;
*pbeg = (*pbeg)->p;
delete pv;
}


//MAIN
 void main() 
{
    setlocale(0,"Russian");
    stack *top=NULL;
    Node *pbeg = NULL;
Node *pend = pbeg;

    setlocale(0,"Russian");
FILE*fp=fopen("1.txt","r"); 
if (fp) 
{ 
while (!feof(fp)) 
{ 
    char g=fgetc(fp);
    if (isdigit(g)) {push(g, &top);}
        else cout<<pop(&top);
        if (isalpha(g)) {add(g, &pend);}
        else cout<<del(&pend);
while (pbeg) cout<<del(&pbeg); 
fclose(fp);
} 
_getch(); 
}

Что я не то сделал?
Помогите пожалуйста с программой.
PM MAIL ICQ   Вверх
Ozerich
Дата 8.4.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

Репутация: 4
Всего: 5



Для стека удобнее использовать Cтэк
Для очереди - Очередь

--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
DiNeo
Дата 8.4.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



Я так понял это стандартные функции уже созданные? или я не так понял...

Добавлено через 3 минуты и 11 секунд
А можете вот этот код помочь подогнать под условия задания:
Код

#include <stdio.h>
#include <ctype.h>

void main()
{
FILE * f1, * f2;
char fname1[50], fname2[50];
char charstring[256], digitstring[256];
int ds_i, cs_i;
int c;

printf("Enter name source file: ");
scanf("%s", fname1);
f1 = fopen(fname1, "r");

printf("Enter name target file: ");
scanf("%s", fname2);
f2 = fopen(fname2, "w");

do
{
ds_i = cs_i = 0;
while (((c = fgetc(f1)) != '\n') && c != EOF)
if (isdigit(c))
digitstring[ds_i++] = c;
else
charstring[cs_i++] = c;
digitstring[ds_i] = charstring[cs_i] = '\0';
fprintf(f2, "%s%s\n", charstring, digitstring);
} while (c != EOF);
fclose(f1);
fclose(f2);
}

Только здесь в конец каждой строки добавляются числа не в обратном порядке.

PM MAIL ICQ   Вверх
Ozerich
Дата 8.4.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

Репутация: 4
Всего: 5



Код

#include <cstdio>
#include <stack>
#include <queue>
#include <iostream>

using namespace std;

bool isDigit(char ch)
{
    return (ch >= '0' && ch <= '9');
}

int main()
{
    FILE *f = fopen("1.txt", "r");
    char cur;
    stack<char> st;
    while(f && !feof(f))
    {
        cur = fgetc(f);
        if(cur <= 0)
            continue;
        if(isDigit(cur))
            st.push(cur);
        else if(cur != 10)
            cout << cur;
        else if(cur == 10)
        {
            while(!st.empty())
            {
                cout << st.top();
                st.pop();
            }
            cout << cur;
        }
    }
    while(!st.empty())
    {
        cout << st.top();
        st.pop();
    }
    cin.get();
    return 0;
}

--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
DiNeo
Дата 8.4.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



Спасибо за ссылки,очень познавательно.

Добавлено через 1 минуту и 40 секунд
И за решение очень благодарен!

Добавлено через 12 минут и 44 секунды
У меня еще небольшая просьба есть.. А можно это не стандартными ф-циями еще сделать? Такими, какие у меня в самом первом коде? И выгрузить в фаил.. Если Вам конечно не сложно.. Заранее спасибо.

Добавлено через 13 минут и 56 секунд
Просто мне хочется понять програмировние с самого простого и дальше идти к сложному
PM MAIL ICQ   Вверх
Ozerich
Дата 8.4.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

Репутация: 4
Всего: 5



Ну так замени вызовы стандартных функций своими и для вывода создай еще  файловую переменную, ты же это умеешь делать. smile 
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
DiNeo
Дата 8.4.2010, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



Компилятор ругается (как и в первом коде) на вывод - cout<<pop(&top); и ост.вывод. Я не правильно вывожу?
PM MAIL ICQ   Вверх
Ozerich
Дата 8.4.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

Репутация: 4
Всего: 5



cout<<pop(&top); - это бред какой - то

Реализуй в своём стеке функцию которая возвращает верхний элемент в стеке.( у меня st.top() ).
Потом извлеки верхний элемент функцией pop()
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
DiNeo
Дата 8.4.2010, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



Я сделал, только он дописывает не цифры а нули вместо них (  Что такое...
Код

#include <iostream>
#include <string.h> 
#include <conio.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <iomanip> 
#include <ctype.h>
#include <cstdio>
//#include <stack>
//#include <queue>
using namespace std;
struct stack
{ 
    char d; 
    stack *next; 
}; 

int push (char d, stack **top) 
{ 
stack *pv = new stack; 
pv->d = d; 
pv->next = *top; 
*top = pv; 
return 0;
} 
// Выборка из стека 
int pop (stack **top) 
{  
stack *pv= *top; 
*top=(*top)->next;
delete pv;
return 0;
}

bool isDigit(char ch)
{
    return (ch >= '0' && ch <= '9');
}

int main()
{
    stack *top=NULL;
    FILE *f = fopen("1.txt", "r");
    char cur;
    //stack<char> st;
    while(f && !feof(f))
    {
        cur = fgetc(f);
        if(cur <= 0)
            continue;
        if(isDigit(cur))
            push(cur, &top);
        else if(cur != 10)
            cout << cur;
        else if(cur == 10)
        {
            while(top!=NULL)
            {
                //push(cur, &top);
                cout<<pop(&top);
                
            }
            cout << cur;
        }
    }
    while(!feof(f))
    {
        cout <<pop(&top);
        pop(&top);
    }
    cin.get();
    return 0;
}


PM MAIL ICQ   Вверх
DiNeo
Дата 8.4.2010, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



Цитата(Ozerich @  8.4.2010,  18:45 Найти цитируемый пост)
Реализуй в своём стеке функцию которая возвращает верхний элемент в стеке.( у меня st.top() ).Потом извлеки верхний элемент функцией pop()


А у меня же в функции pop()  мы вынимаем верхний элемент,ставим указатель на следующий и удаляем тот что взяли
PM MAIL ICQ   Вверх
Ozerich
Дата 8.4.2010, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

Репутация: 4
Всего: 5



Цитата(DiNeo @ 8.4.2010,  19:17)
Цитата(Ozerich @  8.4.2010,  18:45 Найти цитируемый пост)
Реализуй в своём стеке функцию которая возвращает верхний элемент в стеке.( у меня st.top() ).Потом извлеки верхний элемент функцией pop()


А у меня же в функции pop()  мы вынимаем верхний элемент,ставим указатель на следующий и удаляем тот что взяли

В хорошей реализации стека pop должна удалять верхний элемент, а top возвращать значение верхнего элемента   smile

Добавлено через 5 минут и 24 секунды
А у тебя вообще твой стек работает? Если не хочешь стандартный стек использовать, то почему не сделать стек на массиве. А то я в твоих указателях на указатель не понимаю что ты сделать хочешь smile 
--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
DiNeo
Дата 8.4.2010, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



а как его делать?...

Добавлено через 5 минут и 39 секунд
мой стек работает... ток каким то левым местом...(
PM MAIL ICQ   Вверх
Ozerich
Дата 8.4.2010, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

Репутация: 4
Всего: 5



Цитата(DiNeo @ 8.4.2010,  20:17)
а как его делать?...

Добавлено @ 20:22
мой стек работает... ток каким то левым местом...(

Обычный статический массив заводишь и индекс-указатель на конец.
Код

int ms[1000]; //массив
int ind; //указатель на конец


Добавление
Код

ms[ind++] = val;


Удаление
Код

ind--;


Значение верхнего элемента
Код

return ms[ind]


Во, как всё просто smile 

--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
DiNeo
Дата 8.4.2010, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



А можешь полностью весь код выложить? И просьба сделать чтоб в фаил скидывал.. Я уже по нулям.. -_- .. а завтра сдавать..
Пожалуйста...
PM MAIL ICQ   Вверх
Ozerich
Дата 8.4.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 2.8.2009
Где: Минск, Беларусь

Репутация: 4
Всего: 5



Код

#include <cstdio>
#include <iostream>

using namespace std;

char st[10000];
int sl = 0;

bool isDigit(char ch)
{
    return (ch >= '0' && ch <= '9');
}
int main()
{
    FILE *fin = fopen("input.txt", "r");
    FILE *fout = fopen("output.txt", "w");
    char cur;
    while(fin && !feof(fin))
    {
        cur = fgetc(fin);
        if(cur <= 0)
            continue;
        if(isDigit(cur))
            st[sl++] = cur;
        else if(cur != 10)
            fprintf(fout,  "%c", cur);
        else if(cur == 10)
        {
            while(sl >= 0)
                fprintf(fout, "%c", st[--sl]);
            fprintf(fout,  "%c", cur);
        }
    }
    while(sl >= 0)
        fprintf(fout, "%c", st[--sl]);
    return 0;
}

--------------------
C++(STL) / DHTML(CSS) / Javascript / PHP  Developer
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0959 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.