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

Стек и операции с ним - проверка кода на корректность

23.09.2014, 12:42. Показов 2570. Ответов 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication3{
    class Stack{
 
        private int[] elements;
        private int size;
 
        public Stack(){
            this.elements = new int[0];
            this.size = elements.Length;
        }
 
        public void push(int e){
            if (this.size == elements.Length){
                int[] newArray = new int[this.elements.Length + 1];
                Array.Copy(this.elements, 0, newArray, 0, this.size);
                this.elements = newArray;
                this.elements[this.size++] = e;
            }
        }
 
        public int pop(){
            if (this.elements.Length == 0)
                throw new Exception("Не существующий элемент массива");
           
            this.size -= 1;
            int el = elements[this.size];
            int[] newArray = new int[this.size];
            Array.Copy(this.elements, 0, newArray, 0, this.size);
            this.elements = newArray;
            return el;
        }
 
        public int getSize{
            get{ return elements.Length; }
        }
 
        public bool isEmpty{
            get { return this.size == 0; }
        }
 
        public int peek{
            get{ return this.elements[this.size-1]; }
        }
 
        public override bool Equals(object obj){
 
            Stack s = obj as Stack;
 
            if(this.size == s.size){
                for (int i = 0; i < this.size;i++ ){
                    if (this.elements[i] == s.elements[i]){
                        return true;
                    }
                }
            }else
                return false;
            throw new Exception("Ошибка при сравнении");
        }
 
        public override int GetHashCode(){
            int hashCode=0;
            const int constant = 31;
            for (int i = 0; i < this.size;i++ ){
                hashCode = constant * this.elements[i];
            }
            return hashCode;
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.09.2014, 12:42
Ответы с готовыми решениями:

Проверка на корректность операции
Добрый день. Не знаю как лучше задать вопрос. Смысл идеи таков: Есть интерфейс типа данных (IVariable) и наследники от него,...

Как можно создать стек и производить операции над ним?
Как можно создать стек и производить операции над ним? Читал различную литературу, но хорошего объяснения так и не нашел. Где-то пишут, что...

Проверка кода на корректность
Сделал выподающее меню. Всё работает, меня только один вопрос гложет: всё ли корректно, может код считаться хорошим? &lt;ul...

3
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
23.09.2014, 12:51
0) а почему реализуете на массиве, если у вас такое малое кол-во элементов, то может лучше будет на связанном списке реализовать?
1) не следует изменять массив на один элемент, это очень затратная операция. обычно практикуется удвоение буфера данных(не забудьте проверку на выход за границы типа int) и уменьшать его каждый раз не надо. пусть лучше будет зарезервирована лишняя память, чем каждый раз переписывать массив.
2) соответственно ввести переменную для индекса последнего элемента и переписать немного все методы
3) у вас в Equals возвращается завершается сразу после проверки первого элемента. return - это завершение метода
4) метод GetHashCode будет возвращать одинаковое значение для тех стеков, у которых одинаковый ПОСЛЕДНИЙ элемент. пересмотрите алгоритм
0
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 121
23.09.2014, 13:46  [ТС]
на массиве потому что такое задание

Добавлено через 52 минуты
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication3{
    class Stack{
 
        private int[] elements;
        private int size;
 
        public Stack(){
            this.elements = new int[0];
            this.size = elements.Length;
        }
 
        public void push(int e){
            if (this.size == elements.Length){
                int[] newArray = new int[this.elements.Length + 1];
                Array.Copy(this.elements, 0, newArray, 0, this.size);
                this.elements = newArray;
                this.elements[this.size++] = e;
            }
        }
 
        public int pop(){
            if (this.elements.Length == 0)
                throw new Exception("Не существующий элемент массива");
           
            this.size -= 1;
            int el = elements[this.size];
            int[] newArray = new int[this.size];
            Array.Copy(this.elements, 0, newArray, 0, this.size);
            this.elements = newArray;
            return el;
        }
 
        public int getSize{
            get{ return elements.Length; }
        }
 
        public bool isEmpty{
            get { return this.size == 0; }
        }
 
        public int peek{
            get{ return this.elements[this.size-1]; }
        }
 
        public override bool Equals(object obj){
 
            Stack s = obj as Stack;
            return this.elements.SequenceEqual(s.elements);
        }
 
        public override int GetHashCode(){
            int hashCode=0;
            for (int i = 0; i < this.size;i++ ){
                hashCode = 31 * this.elements[i]* this.elements.Length;
            }
            return hashCode;
        }
    }
}
Переписал немного Equals и HashCode

Цитата Сообщение от Learx Посмотреть сообщение
1) не следует изменять массив на один элемент, это очень затратная операция. обычно практикуется удвоение буфера данных(не забудьте проверку на выход за границы типа int) и уменьшать его каждый раз не надо. пусть лучше будет зарезервирована лишняя память, чем каждый раз переписывать массив.
2) соответственно ввести переменную для индекса последнего элемента и переписать немного все методы
Поясни побольше
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
23.09.2014, 14:44
переписал push. в pop и peek так же используем curr а не size
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
namespace ConsoleApplication3{
    class Stack{
 
        private int[] elements;
        //size не нужен, у нас есть Length
        //private int size;
        private int curr;//индекс последнего незанятого элемента
 
        public Stack(){
            this.elements = new int[10]; curr=0;
        }
 
        public void push(int e){
            if (curr == elements.Length){
//если при удвоении будет переполнение, то новый размер Int32.Max, иначе удваиваем
                int size = elements.Length>Int32.Max<<2? Int32.Max : elements.Length>>2;
                int[] newArray = new int[size];
                Array.Copy(this.elements, 0, newArray, 0, elements.Length);
                this.elements = newArray;
                this.elements[curr++] = e;
            }
            else 
            { 
                this.elements[curr++] = e;            
            }
        }
Добавлено через 13 минут
Equals теперь работает, но думаю, что преподу не понравится что вы используете стандартную библиотеку.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public int getSize{
            get{ return curr; }
        }
//учитывается порядок элементов!!! 1,2,3 не равен стеку 1,3,2!!!
public override bool Equals(object obj){ 
            Stack s = obj as Stack; 
//если пытаемся сравнить не со стеком
            if(s==null) throw new ArgumentException();
//если разное к-во элементов
            if(this.curr != s.getSize) return false;
            for (int i = 0; i < this.size;i++ ){
                    if (this.elements[i] != s.elements[i]){
 //если элементы не равны
                        return false;
                    }
            }
            return true;
        }
Добавлено через 2 минуты
Тангенс, getHashCode должен учитывать ВСЕ элементы для вычисления.
например,
C#
1
2
3
4
5
6
7
8
public override int GetHashCode(){
            const int constant = 31;
            int hashCode=constant * curr;
            for (int i = 0; i < curr;i++ ){
                hashCode ^= constant * this.elements[i];
            }
            return hashCode;
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.09.2014, 14:44
Помогаю со студенческими работами здесь

Проверка кода на корректность
можно ли тут выкладывать код на проверку? ничего серьезного, просто игра с условием и цифрами. что-то не сходится и кажется, не совсем...

Проверка кода на корректность
Добрый день! Сверстала, если можно так назвать первый сайт по шаблону учебного с Codeacademy (код писала сама, ссылка на сайт...

Портирование кода на С++ (проверка вводимых данных пользователем на корректность)
Требуется портировать код с С# на С++. Код на шарпе - очень простой. В нем не используются языковые особенности шарпа, перевести, я думаю,...

Программирование метода градиентного спуска - проверка кода на корректность
Здравствуйте! мне необходимо сдать лабораторную работу по методу градиентного спуска. я запрограммировал этот метод поиска минимума...

Проверка пин кода и в соответствии с ним заполнить поля после ввода пин-кода на другой форме
Здраствуйте!Люди проблема в следующем, есть задача где мне надо сделать проверку пин кода и в соответствии с ним чтобы автоматически из...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru