0 / 0 / 0
Регистрация: 01.01.2019
Сообщений: 42
1

Объединить числа из двух стеков в третий стек

11.12.2019, 09:39. Показов 5833. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Столкнулась с такой проблемой - у меня есть два стека с числами (stack1, stack2), уже отсортированными, мне надо все эти числа из обоих стеков переместить в новый созданный третий стек (stack3). И вот тут не получается никак...Подскажите пожалуйста, как это можно реализовать?
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
namespace ConsoleApp265
{
    class Program
    {
        class Node
        {
            public int value;
            public Node next;
            public Node previous;
        }
    
 
        class Stack
        {
            private Node root;
            private Node top;
  
 
            public void Push(int _value)
            {
                if (root == null)
                {
                    root = new Node();
                    root.value = _value;
                    top = root;
                }
                else
                {
                   top.next = new Node();
                    top.next.value = _value;
                    top.next.previous = top;
                    top = top.next;
                }
            }
            public int Pop(int _value)
            {
                int res;
                if (root == null)
                {
                    Console.WriteLine("Error: stack is empty");
                }
                else if (root == top)
                {
                    res = root.value;
                    root = null;
                    return res;
                }
                res = top.value;
                top = top.previous;
                top.next = null;
                return res;
            }
            private Node ElementAt(int num)
            {
                if (root != null && num > -1)
                {
                    int c = 0;
                    Node current = root;
                    while (c < num)
                    {
                        c++;
                        current = current.next;
                    }
                    return current;
 
                }
                return null;
            }
            private int Count()
            {
                int c = 0;
                if (root != null)
                {
                    Node current = root;
                    while (current != top)
                    {
                        c++;
                        current = current.next;
                    }
                    c++;
                }
                return c;
            }
   
         
            public void Sort() //Сортировка по убыванию
            {
                int n = this.Count();
                int step = n / 2;
                int j;
                while (step > 0)
                {
                    for (int i = 0; i < (n - step); i++)
                    {
                        j = i;
                        while (j >= 0 && this.ElementAt(j).val < this.ElementAt(j + step).val)
                        {
                            Node first = this.ElementAt(j);
                            Node second = this.ElementAt(j + step);
                            int buf = first.value;
                            first.value = second.value;
                            second.value = buf;
                            j--;
                        }
                    }
                    step /= 2;
                }
            }
          
         
            public void Print()
            {
                if (root == null)
                {
                    Console.WriteLine("Stack is empty");
                    return;
                }
                Node i = root;
                while (i != top)
                {
                    Console.Write(i.value.ToString() + " ");
                    i = i.next;
                }
                Console.WriteLine(top.value.ToString());
            }
        }
 public static void Main(string[] args)
        {
 
            Stack stack = new Stack(); // Создали 1-ый стек
            stack.Push(5);
            stack.Push(3);
            stack.Push(7);
            stack.Push(2);
            stack.Push(1);
            stack.Print();
            stack.Sort();  
            stack.Print(); 
   
   Stack stack2 = new Stack(); //Создали 2-ой стек
            stack2.Push(11);
            stack2.Push(3);
            stack2.Push(16);
            stack2.Push(2);
            stack2.Push(0);
            stack2.Print();
            stack2.Sort();  //Сортировка стека
            stack2.Print(); //Вывод стека
            Console.ReadKey();
            Console.ReadKey();
   
   
    Stack stack3 = new Stack(); //Создали 3-ий стек, который должен хранить числа из двух предыдущих стеков
            
 
 
................................................................
 
 
 
            Console.ReadKey();
        }
      
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2019, 09:39
Ответы с готовыми решениями:

Как создать указатель на вершину стека ? Объединить числа из двух упорядоченных стеков в третий упорядоченный стек
Всем привет . Как в С# создать указатель который указывает на вершину стека ? прошу максимально...

Заполнить третий стек общими элементами для первых двух стеков
Даны два стека и необходимо заполнить третий общими элементами для первый двух. Не знаю как...

Слияние двух стеков в третий
Нужен код вот этой программы : Разработать программу слияния двух стеков, содержащих возрастающую...

Создать стек из двух других стеков
Из двух стеков, хранящих слова, создать новый стек со словами длины K (задается пользователем), не...

13
17 / 10 / 8
Регистрация: 06.12.2019
Сообщений: 19
11.12.2019, 10:06 2
вытолкнуть оба стека в третий . всё у вас реализовано уже.
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
11.12.2019, 10:34 3
Viktoriya101, вы явно делаете что-то не то.
Сортированный стек?!
Если это стек, то в нём элементы в порядке обратном записи.
Если это отсортированный список, то это просто список, а не стек.

Это у вас задание такое?
Если да, то дайте его полный текст - задание вызывает сомнения.

Если же задача иная и это ваш способ её реализации, то, скорее всего, вы выбрали неправильный способ реализации.

Добавлено через 7 минут
Viktoriya101, по самой реализации Stack.

Во первых, тип должен объявляться в пространстве имён, а не вложенным в class Program

Во вторых, класса Node используется только внутри Stack. Поэтому он должен быть обыденным закрытым вложенным в Stack.

В третьих, Стек - подразумевает односвязный список от последнего записанного элемента к первому.
Поэтому Node должен содержать только поле next. Поле previous - излишнее и вносит только путаницу.

Стек и Узел лучше сделать обобщёнными типами.
0
0 / 0 / 0
Регистрация: 01.01.2019
Сообщений: 42
11.12.2019, 10:38  [ТС] 4
Да вот же, тоже уже понимаю, что скорей всего наломала дров с этим заданием и пошла не по тому пути.. А исправить не получается, уже запуталась. А задание такое: Даны два стека, хранящие отсортированные по убыванию числа. Построить третий стек, содержащий набор упорядоченных по убыванию чисел, полученных из 2-х предыдущих стеков.

Добавлено через 2 минуты
Сама то программа работает, создает 2 стека, элементы в них выстраивает отсортированные, но вот при переходе к вопросу об построении 3-го стека из элементов предыдущих стеков - тут у меня уже не получилось.
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
11.12.2019, 11:03 5
Лучший ответ Сообщение было отмечено Viktoriya101 как решение

Решение

Viktoriya101, вы перемудрили!
Никакой речи о сортировке Стеков в задании нет!
Речь идёт только об использовании уже отсортированных при записи в Стек значений.
Сейчас скину демо код.

Добавлено через 48 секунд
Viktoriya101, также в задании нет ничего по реализацию кастомного Стека.
Почему не используете дефолтный?

Добавлено через 8 минут
C#
1
2
3
4
Random rand = new Random ();
Stack<int> stack1 = new Stack<int>(Enumerable.Range(1, 10).Select(x => rand.Next(100)).OrderByDescending(x =>x).ToList());
Stack<int> stack2 = new Stack<int>(Enumerable.Range(1, 15).Select(x => rand.Next(100)).OrderByDescending(x =>x).ToList());
Stack<int> stack3 = new Stack<int>(stack1.Concat(stack2).OrderByDescending(x =>x).ToList());
1
0 / 0 / 0
Регистрация: 01.01.2019
Сообщений: 42
11.12.2019, 11:23  [ТС] 6
Спасибо за помощь!
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
11.12.2019, 11:39 7
Viktoriya101, вам по заданию можно использовать дефолтный Stack и методы LINQ ?

Добавлено через 8 минут
Viktoriya101, и проверьте порядок элементов: по возрастанию или убыванию?
Стек возможно переворачивает полученную коллекцию.
0
17 / 10 / 8
Регистрация: 06.12.2019
Сообщений: 19
11.12.2019, 11:46 8
Лучший ответ Сообщение было отмечено Viktoriya101 как решение

Решение

Цитата Сообщение от Viktoriya101 Посмотреть сообщение
Даны два стека, хранящие отсортированные по убыванию числа. Построить третий стек, содержащий набор упорядоченных по убыванию чисел, полученных из 2-х предыдущих стеков.

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
using System;
using System.Collections.Generic;
 
class Program
{
    static void Main()
    {
        Stack<int> stack = new Stack<int>();      
        Stack<int> stack2 = new Stack<int>();
        Stack<int> stack3 = new Stack<int>();
 
        stack.Push(88);
        stack.Push(15);
        stack.Push(1);
 
 
        stack2.Push(19);
        stack2.Push(9);
        stack2.Push(6);
                    
        while(!(stack.Count == 0 && stack2.Count == 0))
        {
            if (stack.Count > 0 && stack2.Count > 0)
            {
                if(stack.Peek() < stack2.Peek())
                stack3.Push(stack.Pop());
                else
                    stack3.Push(stack2.Pop());
            }
            else
            {
                if (stack.Count > 0)
                {
                    stack3.Push(stack.Pop());
                }
            
                if (stack2.Count > 0)
                {
                    stack3.Push(stack2.Pop());
                }
              
            }
        }
 
        foreach (int i in stack3)
        {
            Console.WriteLine(i);
        }
    }
}
1
0 / 0 / 0
Регистрация: 01.01.2019
Сообщений: 42
11.12.2019, 11:46  [ТС] 9
По заданию можно и дефолтный использовать. А еще подскажите пожалуйста, у меня потом будет еще подобное задание, но при этом насколько помню, с использованием указателей на вершину стека. Так вот, есть ли стеки, построенные на указателях? Это с использованием unsafe? Заранее извиняюсь, просто указатели не изучала еще, поэтому могу не правильно сформулировать.
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
11.12.2019, 13:26 10
Viktoriya101, здесь скорее всего путаница в терминах.
Имеется ввиду не указатель C#, а ссылка на последний записанный элемент в Стек.
По сути это означает реализовать тоже самое, но без использования LINQ.
Надо в цикле сравнивать элементы на вершине разных.
Записывать больший из них в новый стек.
Цикл закончить когда оба стека опустошатся.

Здесь ещё возникает одна дилемма.
Порядок записи и считывания из стека обратный.
То есть элементы записанные в порядке возрастания будут считываться в порядке убывания.
Поэтому, для реализации важно какой порядок имеется ввиду при записи или при чтении
Возможно придётся делать ещё одну перезапись в стеке.
1
0 / 0 / 0
Регистрация: 01.01.2019
Сообщений: 42
11.12.2019, 13:32  [ТС] 11
Спасибо за разъяснения!
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
11.12.2019, 13:33 12
Viktoriya101, не увидел выше решения tosteel.
Имеется ввиду, что-то аналогичное.
0
0 / 0 / 0
Регистрация: 01.01.2019
Сообщений: 42
11.12.2019, 19:43  [ТС] 13
И можете пожалуйста последний момент подсказать, "Указатели на вершины стеков top и top2" - в данном случае вершины стеков - это stack.Peek() и stack2.Peek()? Просто в процессе "выталкивания" элементов из двух других стеков в третий стек - возникает ошибка, т.е. если top=stack.Peek() и top2=stack2.Peek(), то стек3 заполняется не по убыванию, а просто сначала выводятся числа с 1-го стека, потом со 2-го..

C#
1
2
3
4
5
6
7
 if (stack.Count > 0 && stack2.Count > 0)
            {
                if(top < top2)
                stack3.Push(stack.Pop());
                else
                    stack3.Push(stack2.Pop());
            }
0
Модератор
Эксперт .NET
15465 / 10711 / 2786
Регистрация: 21.04.2018
Сообщений: 31,531
Записей в блоге: 2
12.12.2019, 11:39 14
Лучший ответ Сообщение было отмечено Viktoriya101 как решение

Решение

Viktoriya101, я в поездке и без компа.
На форум захожу со смарта
Разбирать причину ошибок в чужом коде - не могу.

Вот мой вариант.
Проверьте. Пишу со смарта - могут быть ошибки.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Random rand = new Random ();
 
// Создание стеков-источников и объединяющего стека
Stack<int> stack1 = new Stack<int>(Enumerable.Range(1, rand.Next(10, 16)).Select(x => rand.Next(100)).OrderByDescending(x =>x).ToList());
Stack<int> stack2 = new Stack<int>(Enumerable.Range(1, rand.Next(10, 16)).Select(x => rand.Next(100)).OrderByDescending(x =>x).ToList());
Stack<int> stackAll = new Stack<int>();
 
Console.WriteLine("Первый стек {" + string.Join(", ", stack1)+"}");
Console.WriteLine("Второй стек {" + string.Join(", ", stack2)+"}");
 
while (stack1.Count > 0 || stack2.Count > 0)
   if(stack2.Count == 0 || (stack1.Count != 0 && stack1.Peek() > stack2.Peek()))
       stackAll.Push(stack1.Pop());
   else
        stackAll.Push(stack2.Pop());
 
Console.WriteLine("Объединённый стек {" + string.Join(", ", stackAll)+"}");
1
12.12.2019, 11:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2019, 11:39
Помогаю со студенческими работами здесь

Переливание нечётных элементов из двух стеков в стек
У нас есть два стека, получаемых из файлов (Stack1.bat и Stack2.bat), нужно перелить нечётные...

Из двух стеков с целыми числами создать новый стек из элементов первого стека, которых нет во втором
Здравствуйте. Помогите пожалуйста написать код теме: Реализация стека и основных алгоритмов его...

Из двух стеков, хранящих слова, создать новый стек элементов, у которых первая и последняя буква совпадают
Из двух стеков, хранящих слова, создать новый стек, у которых первая и последняя буква совпадают....

Из двух заданных стеков, хранящих символы, создать новый стек из тех символов первого стека, которые есть и в первом
Из двух заданных стеков, хранящих символы, создать новый стек из тех символов первого стека,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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