Repository navigation
Expand file tree
/
Copy pathstack.cs
More file actions
133 lines (113 loc) · 3.48 KB
/
Copy pathstack.cs
File metadata and controls
133 lines (113 loc) · 3.48 KB
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
/**
* Stack implementation using a singly-linked link.
* Part of the OpenGenus/cosmos project. (https://github.com/OpenGenus/cosmos)
*
* A stack is a first-in first-out (FIFO) data structure.
* Elements are manipulated by adding and removing elements of the top of the stack.
*/
using System;
namespace Cosmos_Data_Structures
{
public class Stack<T>
{
//Node is a element that holds the data of the current element plus a reference to the next element.
//Used to implement the singly-linked list.
private class Node
{
public T data;
public Node next;
public Node(T data, Node next)
{
this.data = data;
this.next = next;
}
}
private Node top;
public int Size { get; private set; }
public Stack()
{
top = null;
Size = 0;
}
//Add element to the top of the stack.
public void Push(T element)
{
var newNode = new Node(element, top);
top = newNode;
Size++;
}
//Gets element at the top of the stack.
//Throws an exception if the stack is empty.
public T Peek()
{
if(IsEmpty())
{
throw new InvalidOperationException("Cannot peek on an empty stack!");
}
return top.data;
}
//Removes and returns the element at the top of the stack.
//Throws an exception if the stack is empty.
public T Pop()
{
if(IsEmpty())
{
throw new InvalidOperationException("Cannot pop on an empty stack!");
}
var oldTop = top;
top = top.next;
Size--;
return oldTop.data;
}
//Returns true if stack contains no elements, false otherwise.
public bool IsEmpty()
{
return top == null;
}
//Returns a string representation of the stack.
public override string ToString()
{
Node tmp = top;
string result = "Stack([Top] ";
while(tmp != null)
{
result += tmp.data;
tmp = tmp.next;
if(tmp != null)
{
result += " -> ";
}
}
result += ")";
return result;
}
}
//Stack testing methods/class.
public class StackTest
{
static void Main(string[] args)
{
Console.Write("Creating stack...");
var intStack = new Stack<int>();
for (int i = 0; i < 10; i++)
{
intStack.Push(i);
}
Console.WriteLine("done");
Console.WriteLine(intStack.ToString());
Console.WriteLine("Size of stack: " + intStack.Size);
Console.WriteLine("Topmost element is " + intStack.Peek() + ".\n");
Console.Write("Removing elements...");
for (int i = 0; i < 3; i++)
{
intStack.Pop();
}
Console.WriteLine("done");
Console.WriteLine(intStack.ToString());
Console.WriteLine("Size of stack: " + intStack.Size);
Console.WriteLine("Topmost element is " + intStack.Peek() + ".\n");
Console.WriteLine("Press any key to continue.");
Console.ReadKey();
}
}
}