Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/30: Рейтинг темы: голосов - 30, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 17
1

Соединить два стека в один

18.12.2011, 02:00. Показов 5602. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть два стека, необходимо соединить эти стеки в один. Вот сделал, но выводиться в стеки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
#include "stdio.h"
#include <conio.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
 
 
 
int pop (int steck[]);
void push (int *steck,int x);
int two_steck(int steck1[], int steck2[], int steck3[]);
 
 
int steck1[100], top=-1; 
int steck2[100];
int steck3[200];
 
int pop (int steck[]) {
    int r=0;
    r=steck[top];
    top--;
  return r;
}
 
void push (int *steck,int x) {
    top++;
    steck[top]=x;
}
int two_steck(int steck1[], int steck2[], int steck3[]){
    top++;
    memcpy(steck3, steck2, 100); // Копирует из второго стека в третий в первые 100 эл.
    memmove(steck3+100, steck3, 100); // перемещает данные второго стека в конец
    memcpy(steck3, steck1, 100); // копирует в начало третьего первый
 
    return steck3[top];
}
 
 
 
int main () {
    int i, j, x, x2, y, y2, N;
    
    printf("Количество елементов в стеки:");  
    scanf ("%d", &N);
    
    printf("\nЕлементы первого стека:");
    for(i=0; i<N ;i++){
       scanf ("%d",&x);
       push (steck1,x);
    }
    
    printf("Первый стек:");
    for(j=0; j<N ;j++){
       y=pop (steck1);
       printf("%d ", y);
    }
    
    printf("\n\nЕлементы второго стека:\n");
    for(i=0; i<N ;i++){
      scanf ("%d",&x2);
      push (steck2,x2);
    }
    
    printf("Второй стек:");
    for(j=0; j<N ;j++){
           y2=pop (steck2);
           printf("%d ", y2);
    }
    
   printf("Новый стек:");
 
     for(i=0; i<N;i++){  
        two_steck(steck1,steck2,steck3);
        printf("%d\t", steck3[i]);
     }
 
    return 0;
}
Добавлено через 6 часов 49 минут
Пробывал через указатель, но всеравно не работает.
C
1
2
3
4
5
6
7
8
void two_steck(int*steck1,int size1,int *steck2,int size2)
{
    int*r=steck3;
    for(int i=0;i<size1;i++,r++,steck1++)
        *r=*steck1;
    for(int i=0;i<size2;i++,r++,steck2++)
         *r=*steck2;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2011, 02:00
Ответы с готовыми решениями:

Создать два новых стека, с четными и нечетными элементами первоначального стека
Дано указатель P1 на вершину непустого стека. Создать два новых стека , переместив в первый из них...

Соединить два файла в один
Кароч есть 2 файла один index второй action. Нужно все реализованное в action загрузить в index....

Соединить два массива Raid0 в один
Собственно нужно 2 массива Raid0. Нигде в интернете не могу найти. Сам не могу сделать так как нету...

Как соединить два кода в один?
Вот код генератора перестановок #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;fstream&gt;...

23
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
18.12.2011, 02:16 2
Цитата Сообщение от alan_parker Посмотреть сообщение
int steck1[100], top=-1;
int steck2[100];
int steck3[200];
Сразу бросается в глаза и кажется подозрительным.

Добавлено через 4 минуты
Перед тем как вы объедините два стека в один, вы два исходных стека очищаете.
0
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 17
18.12.2011, 02:18  [ТС] 3
Все равно не работает.
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
18.12.2011, 02:19 4
C++
1
2
3
4
5
printf("Второй стек:");
 for(j=0; j<N ;j++){
 y2=pop (steck2);
 printf("%d ", y2);
 }
N - это размер для одного стека, а не суммы двух стеков.
0
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 17
18.12.2011, 02:21  [ТС] 5
N - это размер стека, 3 стека имеют одинаковый размер
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
18.12.2011, 02:24 6
C++
1
2
3
memcpy(steck3, steck2, 100); // Копирует из второго стека в третий в первые 100 эл.
 memmove(steck3+100, steck3, 100); // перемещает данные второго стека в конец
 memcpy(steck3, steck1, 100); // копирует в начало третьего первый
Тут не учитывается размер стеков. 100 - это макс. размер стека, но не текущее кол-во элементов.

Добавлено через 2 минуты
C++
1
2
3
memcpy(steck3, steck2, 100); // Копирует из второго стека в третий в первые 100 эл.
 memmove(steck3+100, steck3, 100); // перемещает данные второго стека в конец
 memcpy(steck3, steck1, 100); // копирует в начало третьего первый
Второй стек будет находится начиная с элементы steck3[100], а должен находится начиная с конца вставленного первого стека, который не факт, что имеет размер 100.
Т.е. этот код справедлив только тогда, когда top первого стека будет равен 99.
1
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 17
18.12.2011, 02:34  [ТС] 7
а как можно по другому это код, тогда изменить ?
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
18.12.2011, 02:46 8
Сделать для каждого стека свой top. Для этого придется много чего изменить.
Потом в steck3 копировать элементы steck1[0]...steck1[topSteck1] и дальше steck2[0]...steck2[topSteck2].
0
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 17
18.12.2011, 02:52  [ТС] 9
а копирования делать с помощью memcpy
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
18.12.2011, 02:57 10
Цитата Сообщение от alan_parker Посмотреть сообщение
а копирования делать с помощью memcpy
memcpy вообще опасная функция. Лучше делайте циклами.
Вообще не используйте ее, если у вас не будет серьезных доводов в использовании memcpy.
А такие доводы у вас могут появится ТОЛЬКО через много лет.
0
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 17
18.12.2011, 03:10  [ТС] 11
Цитата Сообщение от Chelioss Посмотреть сообщение
Сделать для каждого стека свой top. Для этого придется много чего изменить.
Потом в steck3 копировать элементы steck1[0]...steck1[topSteck1] и дальше steck2[0]...steck2[topSteck2].
А разве через указатели я не так делаю ???
C
1
2
3
4
5
6
7
8
void two_steck(int*steck1,int size1,int *steck2,int size2)
{
    int*r=steck3;
    for(int i=0;i<size1;i++,r++,steck1++)
        *r=*steck1;
    for(int i=0;i<size2;i++,r++,steck2++)
         *r=*steck2;
}
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
18.12.2011, 03:14 12
А как вы выводите результат?
0
Заблокирован
18.12.2011, 04:18 13
Цитата Сообщение от Chelioss Посмотреть сообщение
memcpy вообще опасная функция. Лучше делайте циклами.
Вообще не используйте ее, если у вас не будет серьезных доводов в использовании memcpy.
я бы немного консретизировал. В принципе особо страшного ничего нет, но всегда стоит помнить что memcpy может совершить что угодно (непредсказуемый результат) если источник данных пересекается с приемником. Грубо говоря если копировать данные из одного массива в тот же массив.
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
18.12.2011, 04:32 14
Цитата Сообщение от alkagolik Посмотреть сообщение
В принципе особо страшного ничего нет
Тогда почему вы не заметили ошибку в коде ТС?
Вот вы знаете, что работать с голыми указателями и new\delete опасно. Если нет причин серьезных использовать голые указатели и new\delete, то лучше с ними не работать.
Тут тот же принцип. memcpy - это работа с памятью, а не с массивами.

Добавлено через 4 минуты
Цитата Сообщение от alkagolik Посмотреть сообщение
всегда стоит помнить что memcpy может совершить что угодно (непредсказуемый результат
Помни, не помни, но от ошибок никто не застрахован.
0
Заблокирован
18.12.2011, 04:43 15
Цитата Сообщение от Chelioss Посмотреть сообщение
Тогда почему вы не заметили ошибку в коде ТС?
а я его и не читал. стек на базе статического массива... холодное пивко в зимний мороз на улице.
Цитата Сообщение от Chelioss Посмотреть сообщение
Вот вы знаете, что работать с голыми указателями и new\delete опасно
кто такие голые указатели? Чем опасны вызовы new\delete?
Цитата Сообщение от Chelioss Посмотреть сообщение
memcpy - это работа с памятью, а не с массивами.
спасибо за заботу
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
18.12.2011, 04:47 16
Цитата Сообщение от alkagolik Посмотреть сообщение
а я его и не читал. стек на базе статического массива... холодное пивко в зимний мороз на улице.
Да я не про стек.
C++
1
2
3
 memcpy(steck3, steck2, 100); // Копирует из второго стека в третий в первые 100 эл.
 memmove(steck3+100, steck3, 100); // перемещает данные второго стека в конец
 memcpy(steck3, steck1, 100); // копирует в начало третьего первый
Найдите ошибки. Сразу скажу, дело не в реализацию объединения двух стеков, а в использовании функции memcpy и memmove.
Цитата Сообщение от alkagolik Посмотреть сообщение
кто такие голые указатели? Чем опасны вызовы new\delete?
C++
1
int *ptr;
Цитата Сообщение от alkagolik Посмотреть сообщение
Чем опасны вызовы new\delete?
Утечкой памяти. Или вы про такое не слышали?
0
Заблокирован
18.12.2011, 05:04 17
Цитата Сообщение от Chelioss Посмотреть сообщение
Утечкой памяти. Или вы про такое не слышали?
про кривые руки знаю (это я не про вас, а в общем), про утечку памяти - нет.
Цитата Сообщение от Chelioss Посмотреть сообщение
Найдите ошибки
не вижу я там ошибок, только могу предположить что голые цифры не труЪ, а sizeof(...) * n - труЪ. Ну и конечно главное за пределы не выйти, а какой там размер массивов я тоже не в курсе

Добавлено через 3 минуты
Цитата Сообщение от Chelioss Посмотреть сообщение
Если нет причин серьезных использовать голые указатели и new\delete, то лучше с ними не работать
с этим кстати я согласен, но с другой точки зрения. Не с той что есть опасность, а с той, что доступ к данным на порядок быстрее.
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
18.12.2011, 05:06 18
Цитата Сообщение от alkagolik Посмотреть сообщение
про кривые руки знаю (это я не про вас, а в общем), про утечку памяти - нет.
Понятно.
0
0 / 0 / 0
Регистрация: 17.12.2011
Сообщений: 17
18.12.2011, 14:41  [ТС] 19
Цитата Сообщение от Chelioss Посмотреть сообщение
А как вы выводите результат?
В main-e
C
1
2
3
4
5
      printf("\n\Третий стек:");
      for(k=0; k<N;k++){
         y3=pop (steck3);
         printf("%d ", y3);
       }
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
18.12.2011, 16:10 20
Я же говорил, что размер третьего стека равен 2*N
0
18.12.2011, 16:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2011, 16:10
Помогаю со студенческими работами здесь

Соединить два упорядоченных массива в один
Есть два упорядоченных по возрастанию массива. Нужно создать из них третий, чтобы в нем все...

Как соединить два проекта в один
Здраствуйте мне нужно соединить два проекта в один, чтобы в первом проекте была 5 -ой формой проект...

Как соединить два фильтра в один?
Здравствуйте У меня в программе есть два фильтра, каждый с которых активируется нажатием кнопки: ...

Как соединить два жёских диска в один????
Такая случилась небольшая проблема. я приехал в гости к своей сестре, она мне всегда жаловалась что...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru