数据结构——栈
原文:http://www.cnblogs.com/skywang12345/p/3562239.html
栈的介绍
栈(stack),是一种线性存储结构,它有以下几个特点:
(01) 栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。
(02) 向栈中添加/删除数据时,只能从栈顶进行操作。
栈通常包括的三种操作:push、peek、pop。
push -- 向栈中添加元素。
peek -- 返回栈顶元素。
pop -- 返回并删除栈顶元素的操作。
1. 栈的示意图
栈中的数据依次是 30 --> 20 --> 10
2. 出栈
出栈前:栈顶元素是30。此时,栈中的元素依次是 30 --> 20 --> 10
出栈后:30出栈之后,栈顶元素变成20。此时,栈中的元素依次是 20 --> 10
3. 入栈
入栈前:栈顶元素是20。此时,栈中的元素依次是 20 --> 10
入栈后:40入栈之后,栈顶元素变成40。此时,栈中的元素依次是 40 --> 20 --> 10
1. .NET实现一:数组实现的栈,能存储任意类型的数据
/// <summary> /// 数组实现的栈,能存储任意类型的数据 /// </summary> /// <typeparam name="T"></typeparam> public class GeneralArrayStack<T> { private const int DEFAULT_SIZE = 12; private T[] mArray; private int count; public GeneralArrayStack() { // 不能直接使用mArray = new T[DEFAULT_SIZE]; mArray = (T[])Array.CreateInstance(typeof(T), DEFAULT_SIZE); count = 0; } public GeneralArrayStack(int size) { // 不能直接使用mArray = new T[DEFAULT_SIZE]; mArray = (T[])Array.CreateInstance(typeof(T), size); count = 0; } // 将val添加到栈中 public void push(T val) { mArray[count++] = val; } // 返回“栈顶元素值” public T peek() { return mArray[count - 1]; } // 返回“栈顶元素值”,并删除“栈顶元素” public T pop() { T ret = mArray[count - 1]; count--; return ret; } // 返回“栈”的大小 public int size() { return count; } // 返回“栈”是否为空 public bool isEmpty() { return size() == 0; } // 打印“栈” public void PrintArrayStack() { if (isEmpty()) { Console.WriteLine("stack is Empty"); } Console.WriteLine($"stack size(){size()}"); int i = size() - 1; while (i >= 0) { Console.WriteLine(mArray[i]); i--; } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 tmp=30 2 tmp=20 3 stack size()=3 4 40 5 20 6 10
结果说明:GeneralArrayStack是通过数组实现的栈,而且GeneralArrayStack中使用到了泛型。
2. .NET实现二:Collection集合 中自带的"栈"(stack)的示例
int tmp1 = 0; Stack<int> astack1 = new Stack<int>(); // 将10, 20, 30 依次推入栈中 astack1.Push(10); astack1.Push(20); astack1.Push(30); // 将“栈顶元素”赋值给tmp,并删除“栈顶元素” tmp1 = astack1.Pop(); //System.out.printf("tmp=%d\n", tmp); // 只将“栈顶”赋值给tmp,不删除该元素. tmp1 = astack1.Peek(); //System.out.printf("tmp=%d\n", tmp); astack1.Push(40); while (astack1.Count > 0) { tmp1 = astack1.Pop(); Console.WriteLine($"tmp1={tmp1}"); }
运行结果:
tmp=40 tmp=20 tmp=10