Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Koketka
5 / 5 / 0
Регистрация: 27.11.2009
Сообщений: 232
#1

Очереди и стэки - C++

18.12.2009, 07:19. Просмотров 1123. Ответов 14
Метки нет (Все метки)

Привет!!!
вот код программы, не пойму где ошибки, не выводит элементы стека на основе массива, и с циклической очередью тоже что то не так...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include<stdio.h>
#include<iostream.h>
#include<fstream.h>
 
int *m1 = new int[10];
 
struct Stack {
  int left, right;
  Stack *p;
};
 
struct Queue {
  int d;
  Queue *p;
};
 
 
Stack *pushS(Stack *top, const int l, const int r);   //stack zatalkivanie
Stack *popS(Stack *top, int &l, int &r);              //stack izvlechenie
Queue *firstQ(int d);                                //ochered formirovanie
void addQ(Queue **end, int d);                        //ochered dobavlenie
int delQ(Queue **beg);                                //ochered viborka
Stack *firstS(int left);                             //stek na spiske formirovanie
void push(Stack **top, int left);                    //stek na spiske +
int pop(Stack **top);                                //stek na spiske -
Queue* head = NULL;
void add(Queue *tmp);                                //ciklicheskaya ochered +
Queue *del();                                        //ciklicheskaya ochered - 
 
 
int main() {
  int i, n, l, left, right;
  cout << "Vvedite kol-vo elementov massiva 1: "; cin >> n;
  int *M = new int[n];
  cout << "Vvedite elementi massiva: ";
  for (l = 0; l < n; l++) cin >> M[l];
 
  Stack *top = 0;
  top = pushS(top, 0, n - 1);
  cout << "Stack na massive: ";
  while (top) 
    cout << popS(top, left, right) << "  ";
  cout << endl;
 
  Queue *beg = firstQ(1);                            //ukazatel na nachalo
  Queue *end = beg;                                  //ukazatel na konec
  for(l = 1; l < n; l++) addQ(&end, M[l]);
  cout << "Prostaya ochered: ";
  while (beg)
    cout << delQ(&beg) << " ";
  cout << endl;
  
  top = firstS(1);
  for (i = 1; i < n; i++) push(&top, M[i]);
  cout << "Stack na spiske: ";
  while (top)
    cout << pop(&top) << " ";
  cout << endl;
 
  char s[1];
  gets(s);
 
  return 0;
 
}
 
/*stek na baze massiva + */
Stack *pushS(Stack *top, const int l, const int r) {
  Stack *pv = new Stack;
  pv->left = l;
  pv->right = r;
  pv->p = top;
}
 
/*stek na baze massiva - */
Stack *popS(Stack *top, int &l, int &r) {
  Stack *pv = top->p;
  l = top->left;
  r = top->right;
  delete top;
  return pv;
}
 
/*prostaya ochered formirovanie*/
Queue *firstQ(int d){
  Queue *pv = new Queue;
  pv->d = d;
  pv->p = 0;
  return pv;
}
 
/*prostaya ochered + */
void addQ(Queue **end, int d){
  Queue *pv = new Queue;
  pv->d = d;
  pv->p = 0;
  (*end)->p = pv;
  *end = pv;
}
 
/*prostaya ochered - */
int delQ(Queue **beg){
  int temp = (*beg)->d;
  Queue *pv = *beg;
  *beg = (*beg)->p;
  delete pv;
  return temp;
}
 
/*stek na spiske formirovanie*/
Stack *firstS(int left){
  Stack *pv = new Stack;
  pv->left = left;
  pv->p = 0;
  return pv;
}
 
/*stek na spiske + */
void push(Stack **top, int left){
  Stack *pv = new Stack;
  pv->left = left;
  pv->p = *top;
  *top = pv;
}
 
/*stek na spiske - */
int pop(Stack **top){
  int temp = (*top)->left;
  Stack *pv = *top;
  *top = (*top)->p;
  delete pv;
  return temp;
}
 
/*ciklicheskaya ochered + */
void add(Queue *tmp, int d){
  Queue *tail = new Queue ;
  tail->d = tmp->d;
  tail->p = head;
  Queue *ip = tail->p;
  while(!(ip->p==head))   ip = ip->p;
  ip->p = tail;    
}
 
/*ciklicheskaya ochered - */
Queue *del(Queue *tmp){
  tmp = head;
  head = (head==head->p)?NULL:head->p;        
  return tmp;  
}
заранее спасибо
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2009, 07:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Очереди и стэки (C++):

Немного исправить ошибки. Тема: стэки, списки, очереди. Не понимаю в чем дело - C++
// 15.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #define reis struct...

Стэки - C++
Помогите пожалуйста Как найти максимальный элемент стэка Задание:найти макс эл-т стэка и поменять его местами с первым элементом стэка ...

Очереди. Каким образом считать две очереди из одного текстового файла? - C++
Здравстуйте. В задании первый пункт состоит в том, что нужно сформировать две очереди по n элементов с помощью считки данных из...

Найдите суммарную длину строк, принадлежащих очереди, кроме первой строки очереди - C++
Создать очередь строковых значений, для реализации используя односвязные списки.Реализовать операции добавления (enqueue) и удаления...

Извлечь из очереди начальные элементы и вывести их значения и новые адреса начала и конца очереди - C++
Дано число N (&gt; 0) и указатели P1 и P2 на начало и конец непустой очереди. Извлечь из очереди N начальных элементов и вывести их значения...

Создание очереди и удаление элемента очереди по усмотрению пользователя - C++
Вот код он создает очередь и должен удалить элемент очереди по усмотрению пользователя проблема заключается в том что при попытки удалить...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
18.12.2009, 11:32 #2
функция Stack *pushS(Stack *top, const int l, const int r) {...} не заполняет стек. Среди её агрументов нет значения, которое нужно вставить в стек.
1
Koketka
5 / 5 / 0
Регистрация: 27.11.2009
Сообщений: 232
19.12.2009, 02:24  [ТС] #3
а вот эти функции правильно написаны?!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*stek na baze massiva + */
Stack *pushS(Stack *top, const int l, const int r) {
  Stack *pv = new Stack;
  pv->left = l;
  pv->right = r;
  pv->p = top;
}
 
/*stek na baze massiva - */
Stack *popS(Stack *top, int &l, int &r) {
  Stack *pv = top->p;
  l = top->left;
  r = top->right;
  delete top;
  return pv;
}
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
19.12.2009, 09:37 #4
/*stek na baze massiva + */
а куда делось top = pv ?

Добавлено через 1 минуту
/*stek na baze massiva - */
Stack *pv = top - для стека вроде так
1
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
19.12.2009, 12:58 #5
C++
1
2
3
4
5
6
Stack *pushS(Stack *top, const int l, const int r) {
  Stack *pv = new Stack;
  pv->left = l;
  pv->right = r;
  pv->p = top;
}
Поставте return pv;
P.s
C++
1
const int l,int r;
необязательно.

Цитата Сообщение от Aye Aye Посмотреть сообщение
функция Stack *pushS(Stack *top, const int l, const int r) {...} не заполняет стек. Среди её агрументов нет значения, которое нужно вставить в стек.
Все заполняется stack работает.
P.z не понимаю для чего тут массив вообще.
1
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
19.12.2009, 13:15 #6
если стек работает то где же тогда поле данных в обявлении структуры?
C++
1
2
3
4
struct Stack {
  int left, right;
  Stack *p;
};
и где его заполнение?
C++
1
2
3
4
5
6
Stack *pushS(Stack *top, const int l, const int r) {
  Stack *pv = new Stack;
  pv->left = l;
  pv->right = r;
  pv->p = top;
}
и да, стек здесь явно не на массиве.

Добавлено через 5 минут
стек на массиве это
C++
1
2
3
4
5
6
7
8
struct Stack{
         int index;
         const max=256;
         int info[max];
         Stack(){index=0;}
         int pop(){if (index>1){ info[index];index--;}else cout <<"empty stack\n";}
         void push(int ii){if (index<max){ index++;info[index]=ii;}else cout << "stack is full\n";}
};
примерно так.
использование
C++
1
2
3
Stack S;
S.push(5);
int i=S.pop();
1
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
31.12.2009, 10:43 #7
вот рабочий вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <conio.h>
using namespace std;
struct Stack{
         int index;
         int max;
         int info[256];
         Stack(){index=0;max=256;}
         int pop()
         {
             if (index > 0)
             {
                index--; 
                return info[index+1];
             }
             else
             {
                 cout <<" empty stack ";
                 return 0;
             }
         }
         void push(int ii)
         {
              if (index<max)
              {
                 index++;
                 info[index]=ii;
              }
              else cout << " stack is full ";
         }
};
int main()
{
    Stack S;
    S.push(5);
    S.push(6);
    cout << S.pop();
    cout << S.pop();
    cout << S.pop();
    getch();
}
1
grrrrr
45 / 45 / 7
Регистрация: 21.04.2009
Сообщений: 265
13.09.2011, 16:09 #8
Aye Aye, в чем разница - стек на массиве и просто стек? Я так понимаю, если на массиве то - есть граница - начало и конец массива, по нему мы перемещаемся используя стек. Это мне понятно. А в каких случаях применяется стек не на массиве? И где он используется? Можно простой пример?
0
Сыроежка
Заблокирован
13.09.2011, 18:51 #9
Цитата Сообщение от grrrrr Посмотреть сообщение
Aye Aye, в чем разница - стек на массиве и просто стек? Я так понимаю, если на массиве то - есть граница - начало и конец массива, по нему мы перемещаемся используя стек. Это мне понятно. А в каких случаях применяется стек не на массиве? И где он используется? Можно простой пример?
В стандартной библиотеки STL стек - это адаптирующий контейнер, который для управления своими элементами использует другой стандартный контейнер, например, std::deck.
0
Nameless One
13.09.2011, 18:53
  #10

Не по теме:

Цитата Сообщение от Сыроежка Посмотреть сообщение
std::deck.
только не deck, а deque

0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
13.09.2011, 18:56 #11
Цитата Сообщение от grrrrr Посмотреть сообщение
А в каких случаях применяется стек не на массиве?
допустим, когда нужно часто вставлять-удалять элементы из стека. Если он будет сделан на массиве, то будут бОльшие издержки на перераспределение памяти
1
grrrrr
45 / 45 / 7
Регистрация: 21.04.2009
Сообщений: 265
13.09.2011, 23:55 #12
Nameless One спасибо, решил освоить ООП и в первую очередь наталкиваюсь на стеки, списки, очереди, так там не все так просто
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
14.09.2011, 00:51 #13
grrrrr, вот незатейливый пример со стеком
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <sstream>
#include <stack>
 
int main(){
    std::string str;
    
    while ( std::cout << "String: " && std::getline(std::cin, str) && ! str.empty() ){
        std::istringstream ist(str);
        std::stack<std::string> stack;
        while ( ist >> str )
            stack.push(str);
        std::cout << "Result: ";
        while ( ! stack.empty() ){
            std::cout << stack.top() << ' ';
            stack.pop();
        }
        std::cout << std::endl;
    }
    
    return 0;
}

Не по теме:

Знатного покойника откопали - почти два года пролежал...

0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
14.09.2011, 05:48 #14
grrrrr, тут ООП ни при чем
0
easybudda
14.09.2011, 08:32     Очереди и стэки
  #15

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
тут ООП ни при чем
При желании можно за уши притянуть, вроде "Навыки работы с объектами классов библиотеки STL", ну или как-то так...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2011, 08:32
Привет! Вот еще темы с ответами:

Разработать программу формирования очереди, содержащей целые числа, и упорядочивания по возрастанию элементов в этой очереди. - C++
Доброе всем время суток! Помогите пожалуйста! Разработать программу формирования очереди, содержащей целые числа, и упорядочивания по...

Очереди. Дан массив. Создать две очереди, первая должна содержать все нечетные, а вторая - все четные - C++
Очереди. Дан массив. Создать две очереди, первая должна содержать все нечетные, а вторая - все четные числа из исходного набора; порядок...

Объединить две очереди в одну, как создать две очереди - C++
&quot;Объединить две очереди в одну, чередуя элементы первой и второй очереди. Основной вопрос как создать две очереди? точнее даже три, в...

Очереди в С++ - C++
Помогите пожалуйста, очень нужно! Вот такое задание. Сформировать динамическую структуру очередь, содержащую данные по студентам в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.09.2011, 08:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru