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

Подправить стек - C++

Восстановить пароль Регистрация
 
 
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
17.11.2012, 22:27     Подправить стек #1
Что здесь не так? Помогите исправить ошибку, я уже 3 дня исправляю, и не могу додуматься в чем проблема!
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
#include<iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;
const int maxlength = 100;
struct Stack
{
    int top;
    char elements[maxlength];
};
void MAKENULL(Stack *);
char TOP(Stack *);
void POP(Stack *);
void PUSH(char ch, Stack *);
bool EMPTY(Stack *);
void PRINT(Stack *);
 
int main()
{
    Stack S;
    int c;
    MAKENULL (&S);
    cin>>c;
    while(c != '=')
    {
        switch (c)
        {
        case 1:
            {
                POP(&S);
                break;
            }
        case 2:
            {
                MAKENULL(&S);
                break;
            }
        case 3:
            {
                PUSH(TOP(&S),&S);
                break;
            }
        default:
            {
                PUSH(c,&S);
                break;
            }
        }
        c = getchar();
    }
        PRINT(&S);
        getch();
        return 0;
}
char TOP(Stack *S)
{
  if (EMPTY(S) == true)
    printf("Stack is empty\n");
  else 
    return S->elements[S->top];
}
 
void MAKENULL(Stack *S)
{
  S->top = maxlength + 1;
}
 
void POP(Stack *S)
{
  if (EMPTY(S) == true)
    printf("Stack is empty\n");
  else 
    S->top = S->top + 1;
}
 
void PUSH(char ch, Stack *S)
{
  if (S->top == 0)
    printf("Stack is full\n");
  else 
  {
    S->top = S->top - 1;
    S->elements[S->top] = ch;
  }
}
  
bool EMPTY(Stack *S)
{
  if (S->top == maxlength)
    return true;
  else 
    return false;
}
 
void PRINT(Stack *S)
{
  for (int i = maxlength; i >= S->top; i--) 
  {
    putchar(S->elements[i]);
  }
  printf("\n");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
17.11.2012, 23:14     Подправить стек #2
9 char elements[maxlength];

65 S->top = maxlength + 1;

82 S->top = S->top - 1; -- будет maxlength
83 S->elements[S->top] = ch; -- выход за границы
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
17.11.2012, 23:16  [ТС]     Подправить стек #3
I.M., можете показать как эти ошибки исправить?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
17.11.2012, 23:36     Подправить стек #4
65
C++
1
S->top = maxlength;
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
17.11.2012, 23:43  [ТС]     Подправить стек #5
и не подскажете как правильно заполнить стек чтобы проверить работают ли функции.
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
18.11.2012, 00:49     Подправить стек #6
Вот код, немного подправленный, но все правильно работает, проверил. Еще можно в некоторых местах оптимизировать. Если есть вопросы - отвечу.
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
// stack.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include<iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;
const int maxlength = 100;
struct Stack
{
    int top;
    char elements[maxlength];
};
void MAKENULL(Stack *);
char TOP(Stack *);
void POP(Stack *);
void PUSH(char ch, Stack *);
bool EMPTY(Stack *);
void PRINT(Stack *);
 
int main()
{
    Stack S;
    char c;
    MAKENULL(&S);
    cout << S.top << endl;
    cin>>c;
    while(c != '=')
    {
        switch (c)
        {
        case '1':
            {
                POP(&S);
                break;
            }
        case '2':
            {
                MAKENULL(&S);
                break;
            }
        case '3':
            {
                if (TOP(&S) != 0)
                    PUSH(TOP(&S),&S);
                break;
            }
        default:
            {
                PUSH(c,&S);
                break;
            }
        }
        cin >> c;
    }
        PRINT(&S);
        getch();
        return 0;
}
char TOP(Stack *S)
{
  if (EMPTY(S) == true){
    printf("Stack is empty\n");
    return 0;
  }
  else 
    return S->elements[S->top];
}
 
void MAKENULL(Stack *S)
{
  S->top = maxlength;
}
 
void POP(Stack *S)
{
  if (EMPTY(S) == true)
    printf("Stack is empty\n");
  else 
    S->top = S->top + 1;
}
 
void PUSH(char ch, Stack *S)
{
  if (S->top == 0)
    printf("Stack is full\n");
  else 
  {
    S->top = S->top - 1;
    S->elements[S->top] = ch;
  }
}
  
bool EMPTY(Stack *S)
{
  if (S->top == maxlength)
    return true;
  else 
    return false;
}
 
void PRINT(Stack *S)
{
  for (int i = maxlength-1; i >= S->top; i--) 
  {
    putchar(S->elements[i]);
  }
  printf("\n");
}
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
18.11.2012, 01:09  [ТС]     Подправить стек #7
Peregrin, Я что-то не могу понять, работает ли он или нет! А как его заполнить каким-то данными?
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
18.11.2012, 01:14     Подправить стек #8
Просто пишешь какие-то символы, например:

A
1
B
C
=

При вводе "1" будет сделан POP, т.е. последний элемент выкинется.
При вводе "2" стек очистится.
При вводе "3" в стек будет добавлен элемент TOP.
При вводе какого-либо другого символа, он будет добавлен в стек.
Ввод "=" - конец программы и вывод стека.
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
18.11.2012, 01:17  [ТС]     Подправить стек #9
Peregrin, я вот так и делаю ввожу abcd и жму = и выходить из программы!
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
18.11.2012, 01:22     Подправить стек #10
Очень странно, я ввожу:
abcd=

Мне выводит стек:
abcd

И выходит из программы. У тебя не так?

P.S.: В коде можно убрать cout << S.top << endl;, это лишний вывод
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
18.11.2012, 01:25  [ТС]     Подправить стек #11
у меня тоже так почему-то!
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
18.11.2012, 01:29     Подправить стек #12
Погоди, а что должно быть то? Ты хочешь, чтобы после ввода "=" программа не выходила, а продолжала работать?
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
18.11.2012, 01:31  [ТС]     Подправить стек #13
Я хочу, чтобы я ввел данные в стек и потом еще провел над этими данными операции!
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
18.11.2012, 01:34     Подправить стек #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
// stack.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include<iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;
const int maxlength = 100;
struct Stack
{
    int top;
    char elements[maxlength];
};
void MAKENULL(Stack *);
char TOP(Stack *);
void POP(Stack *);
void PUSH(char ch, Stack *);
bool EMPTY(Stack *);
void PRINT(Stack *);
 
int main()
{
    Stack S;
    char c;
    MAKENULL(&S);
    cin>>c;
    while(true)
    {
        switch (c)
        {
        case '1':
            {
                POP(&S);
                break;
            }
        case '2':
            {
                MAKENULL(&S);
                break;
            }
        case '3':
            {
                if (TOP(&S) != 0)
                    PUSH(TOP(&S),&S);
                break;
            }
        case '=':
            {
                PRINT(&S);
                break;
            }
        case '0':
            {
                return 0;
            }
        default:
            {
                PUSH(c,&S);
                break;
            }
        }
        cin >> c;
    }
}
char TOP(Stack *S)
{
  if (EMPTY(S) == true){
    printf("Stack is empty\n");
    return 0;
  }
  else 
    return S->elements[S->top];
}
 
void MAKENULL(Stack *S)
{
  S->top = maxlength;
}
 
void POP(Stack *S)
{
  if (EMPTY(S) == true)
    printf("Stack is empty\n");
  else 
    S->top = S->top + 1;
}
 
void PUSH(char ch, Stack *S)
{
  if (S->top == 0)
    printf("Stack is full\n");
  else 
  {
    S->top = S->top - 1;
    S->elements[S->top] = ch;
  }
}
  
bool EMPTY(Stack *S)
{
  if (S->top == maxlength)
    return true;
  else 
    return false;
}
 
void PRINT(Stack *S)
{
  for (int i = maxlength-1; i >= S->top; i--) 
  {
    putchar(S->elements[i]);
  }
  printf("\n");
}
Тогда вот такой код, на "0" выход сделал.
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
18.11.2012, 01:41  [ТС]     Подправить стек #15
Вот еще есть такая просьба, можете сделать так чтобы я вибрав POP и мне вывело модифицированный стек?
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
18.11.2012, 01:43     Подправить стек #16
Если я правильно понимаю, что модифицированный стек == обновленный (т.е. без последнего элемента), то просто после 34 строки поставь PRINT(&S):
C++
1
2
3
POP(&S);
PRINT(&S);
break;
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
18.11.2012, 01:56  [ТС]     Подправить стек #17
Peregrin, Все прекрасно работает, большое вам спасибо!

Добавлено через 8 минут
И если вам не трудно можете еще очередь подправить, здесь только шоблон море ошибок, я просто не знаю с чего начать исправлять)
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
#include <iostream>
#include <string.h>
#include <conio.h>
const int maxlenght=100;
using namespace std;
 
struct QUEUE{
      char elements[];
      int front;
      int rear;};
      
int addone (int);
int MAKENULL (QUEUE);
int EMPTY (QUEUE);
int FRONT (QUEUE);
int ENQUEUE (char ,QUEUE);
int DEQUEUE (QUEUE );
 
int main(){
    QUEUE Q;
    for(int i=Q.front;i<Q.rear;i++)
    cin>>Q.elements[i];
    
    char c;
    MAKENULL(Q);                            
    c = getch();
    while (c!='='){
          ENQUEUE (c,Q);}
          DEQUEUE (Q);
          DEQUEUE (Q);
          ENQUEUE ('<',Q) ;
 
   while (!EMPTY(Q)) {
      printf ("%c", FRONT(Q));
      DEQUEUE (Q);
}
}
 
int addone (int i){
      return (i%maxlenght) + 1;}
      
int MAKENULL (QUEUE Q){
            Q.front = 1;
            Q.rear = maxlenght;
            }   
   
int EMPTY (QUEUE Q){
      if (addone(Q.rear)==Q.front)
      return true;
      else return false;
      }
      
int   FRONT (QUEUE Q){
      if (EMPTY (Q))
      cout<<"Cherga is empty";
      else 
      Q.elements[Q.front];
}
 
int ENQUEUE (char , QUEUE Q){
            if (addone(addone(Q.rear))==Q.front)
            cout<<"Cherga is full";
            else{
                  Q.rear = addone (Q.rear);
                  Q.elements[Q.rear] = x;}
            }
     
int  DEQUEUE (QUEUE Q){
      if (EMPTY(Q))
      cout<<"Cherga is empty";
      else 
      Q.front = addone(Q.front);
      }
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
18.11.2012, 02:07     Подправить стек #18
А какое задание для очереди? Как со стеком - действия какие-то по желанию пользователя или что-то другое?
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
18.11.2012, 02:10  [ТС]     Подправить стек #19
Реализовать на языке C / C + + представления АТД "очередь" при помощи циклического массива (операции MAKENULL, FRONT, ENQUEUE, DEQUEUE, EMPTY)
MAKENULL (Q) - очищает очередь Q, делая ее пустой.
FRONT (Q) - функция возвращает первый элемент очереди Q.
ENQUEUE (x, Q) - вставить элемент x в конец очереди Q.
DEQUEUE (Q) - удаляет первый элемент из очереди Q.
EMPTY (Q) - возвращает true тогда и только тогда, когда очередь Q пустая.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2012, 04:53     Подправить стек
Еще ссылки по теме:

Структура стек (: добавить элемент в стек, удалить элемент из стека, получить значение с вершины стека, размер стека...) C++
подправить C++
Переменные в стеке. Где хранятся? Как обрабатываются? Есть ли программный стек или только стек процессора? C++

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

Или воспользуйтесь поиском по форуму:
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
18.11.2012, 04:53     Подправить стек #20
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
#include <iostream>
#include <string.h>
#include <conio.h>
const int maxlength=5;
using namespace std;
 
struct QUEUE{
      char elements[maxlength];
      int front;
      int rear;
};
      
void MAKENULL (QUEUE*);
bool EMPTY (QUEUE*);
char FRONT (QUEUE*);
void ENQUEUE (char ,QUEUE*);
void DEQUEUE (QUEUE*);
void PRINT (QUEUE*);
 
int main(){
    QUEUE Q;
    MAKENULL(&Q);                            
    char c;
    cin >> c;
    while (true){
        switch (c){
        case '1':
            {
                DEQUEUE(&Q);
                break;
            }
        case '2':
            {
                MAKENULL(&Q);
                break;
            }
        case '3':
            {
                if (FRONT(&Q) != 0)
                    ENQUEUE(FRONT(&Q),&Q);
                break;
            }
        case '=':
            {
                PRINT(&Q);
                break;
            }
        case '0':
            {
                return 0;
            }
        default:
            {
                ENQUEUE(c, &Q);
                break;
            }
        }
        cin >> c;
    }
}
 
void MAKENULL (QUEUE* Q){
    Q->front = -1;
    Q->rear = -1;
}   
   
bool EMPTY (QUEUE* Q){
    if (Q->front==-1)
        return true;
    else
        return false;
}
      
char FRONT (QUEUE* Q){
    if (EMPTY(Q)){
        cout<<"Cherga is empty";
        return 0;
    }
    else 
        return Q->elements[Q->front];
}
 
void ENQUEUE (char x, QUEUE* Q){
    if(Q->front==-1){
        Q->front=0;
        Q->rear=0;
        Q->elements[Q->rear]=x;
    }
    else if ((Q->rear+1) % maxlength == Q->front){
        Q->front = (Q->front + 1) % maxlength;
        Q->rear = (Q->rear+1) % maxlength;
        Q->elements[Q->rear] = x;
    }       
    else{
        Q->rear = (Q->rear + 1)%maxlength;
        Q->elements[Q->rear] = x;       
    }
}
     
void DEQUEUE (QUEUE* Q){
    if (EMPTY(Q))
        cout<<"Cherga is empty";
    else
        Q->front = (Q->front + 1)%maxlength;
}
 
void PRINT(QUEUE* Q){
    if (EMPTY(Q)==false){
        if (Q->rear < Q->front){
            for (int i=0; i <= Q->rear; i++)
                putchar(Q->elements[i]);    
            for (int i=Q->front; i < maxlength; i++)
                putchar(Q->elements[i]);
        }
        else
            for (int i=Q->front; i <= Q->rear; i++)
                putchar(Q->elements[i]);
        printf("\n");
    }
}
Фух, до 5 утра сидел но сделал, вот рабочий код.
Yandex
Объявления
18.11.2012, 04:53     Подправить стек
Ответ Создать тему
Опции темы

Текущее время: 16:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru