Skip to content

Instantly share code, notes, and snippets.

@AlexP11223
Last active August 29, 2015 14:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AlexP11223/6525ed0c5461edc3ff0a to your computer and use it in GitHub Desktop.
Save AlexP11223/6525ed0c5461edc3ff0a to your computer and use it in GitHub Desktop.
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