-
-
Save AlexP11223/6525ed0c5461edc3ff0a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
namespace ... | |
{ | |
public class LinkedStack<T> | |
{ | |
// свойство количество элементов, доступно только для чтения из вне | |
public int Count { get; private set; } | |
// свойство пуст ли стек | |
public bool IsEmpty | |
{ | |
get { return Count == 0; } | |
} | |
// вершина стека | |
private Node top; | |
// элемент списка | |
private class Node | |
{ | |
public T Data; | |
public Node Next; | |
} | |
// создание пустого стека | |
public LinkedStack() | |
{ | |
Clear(); | |
} | |
// итератор | |
public IEnumerator<T> GetEnumerator() | |
{ | |
Node current = top; | |
while (current != null) | |
{ | |
yield return current.Data; | |
current = current.Next; | |
} | |
} | |
IEnumerator IEnumerable.GetEnumerator() | |
{ | |
return GetEnumerator(); | |
} | |
// добавить элемент | |
public void Push(T value) | |
{ | |
// запоминаем текущую вершину | |
Node oldTop = top; | |
// создаем новый элемент на вершине | |
top = new Node(); | |
top.Data = value; | |
top.Next = oldTop; // делаем предыдушую вершину следующий элементов | |
Count++; | |
} | |
// вернуть значение элемента на вершине и удалить элемент | |
public T Pop() | |
{ | |
if (IsEmpty) | |
{ | |
throw new Exception("Невозможно достать элемент, стек пуст."); | |
} | |
// запоминаем значение | |
T item = top.Data; | |
// удаляем элемент | |
top = top.Next; | |
Count--; | |
return item; | |
} | |
// вернуть значение элемента на вершине без удаления | |
public T Peek() | |
{ | |
if (IsEmpty) | |
{ | |
throw new Exception("Стек пуст."); | |
} | |
return top.Data; | |
} | |
// очистить стек | |
public void Clear() | |
{ | |
Count = 0; | |
top = null; // просто обнуляем ссылку на элементы, сборщик мусора очистит память от них | |
} | |
} | |
} | |
... | |
static void Main(string[] args) | |
{ | |
var stack = new ArrayStack<string>(); | |
stack.Push("a"); | |
stack.Push("b"); | |
foreach (var item in stack) | |
{ | |
Console.WriteLine(item); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment