C#数据结构-栈
栈的定义不需要多说,相信大家都非常熟悉,但是,在实际应用中栈的应用我们很少想到会去用栈结构,先上代码看下用法:
Stack st = new Stack();
st.Push('A');
st.Push('B');
st.Push('C');
st.Push('D');
foreach (char c in st)
{
Console.Write(c + " ");
}
Console.WriteLine();
st.Push('E');
foreach (char c in st)
{
Console.Write(c + " ");
}
Console.WriteLine();
st.Pop();
st.Pop();
st.Pop();
foreach (char c in st)
{
Console.Write(c + " ");
}
Console.ReadLine();

现在我们自己实现一个栈结构:
/// <summary>
/// 栈
/// </summary>
public class MyStack
{
/// <summary>
/// 栈的实现还是使用数组的方式存储
/// </summary>
public Object[] content { get; set; }
/// <summary>
/// 栈深度
/// </summary>
public int size { get; set; }
/// <summary>
/// 默认开始深度
/// </summary>
public int defaultSize { get; set; } = 10;
/// <summary>
/// 初始化 默认深度
/// </summary>
public MyStack()
{
content = new object[defaultSize];
size = 0;
}
/// <summary>
/// 压栈
/// </summary>
/// <param name="obj"></param>
public virtual void Push(Object obj)
{
//如果数组满了,则扩容(翻倍扩容)
if (size == content.Length)
{
//扩容次数为2的指数级
Object[] newArray = new Object[2 * content.Length];
//将原内容拷贝到新的数组中 (扩容次数 2的指数级扩容,减少拷贝带来的时间消耗)
Array.Copy(content,0,newArray,0,size);
content = newArray;
}
//写入数组
content[size++] = obj;
}
/// <summary>
/// 取下一个出栈值,但不删除 (偷看下~)
/// </summary>
/// <returns></returns>
public virtual Object Peek()
{
if (size == 0)
throw new InvalidOperationException("空栈");
return content[size - 1];
}
/// <summary>
/// 出栈
/// </summary>
/// <returns></returns>
public virtual Object Pop()
{
if (size == 0)
throw new InvalidOperationException("空栈");
Object obj = content[--size];
content[size] = null;
return obj;
}
//实现该方法是为了 暂不实现 ICollection -
public void ShowAll()
{ for (int i=size-1;i>=0;i--)
{
Console.Write($" {content[i]}");
}
Console.WriteLine();
}
}
/// <summary>
/// 异步栈
/// </summary>
public class MySyncStack : MyStack
{
private MyStack myStack; private Object lookObj; public override void Push(Object value)
{
lock (lookObj)
{
myStack.Push(value);
}
} public override Object Pop()
{
lock (lookObj)
{
return myStack.Pop();
}
} public override Object Peek()
{
lock (lookObj)
{
return myStack.Peek();
}
}
}
可以看出,其实栈还是用数组结构来实现的,异步栈在栈的基础上增加了锁。
测试下:
MyStack st = new MyStack();
st.Push('A');
st.Push('B');
st.Push('C');
st.Push('D');
st.ShowAll();
st.Push('E');
st.ShowAll();
st.Pop();
st.Pop();
st.Pop();
st.ShowAll();
Console.ReadLine();


C#数据结构-栈的更多相关文章
- 数据结构——栈(C语言实现)
#include <stdio.h> #include <stdlib.h> #include<string.h> #include<malloc.h> ...
- C++ 泛型 编写的 数据结构 栈
平时编程里经常需要用到数据结构,比如 栈和队列 等, 为了避免每次用到都需要重新编写的麻烦现将 C++ 编写的 数据结构 栈 记录下来,以备后用. 将 数据结构 栈 用头文件的形式 ...
- C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...
- 数据结构——栈的实现(数组、Java)
巩固数据结构 栈是一种有限制的线性表 只能对表尾进行操作 package com.shine.test.datastruct; import java.util.Arrays; public clas ...
- PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题)
PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题) 一.总结 SplStack就是继承双链表(SplDoublyLinkedList)实 ...
- java数据结构——栈(Stack)
学习数据结构与算法是枯燥的,但只有坚持不懈的积累,才会有硕果累累的明天. /** * 继续学习Java数据结构 ————栈 * 栈的实现其实还是使用数组,只不过我们不能直接访问数组下标,而是通过一个指 ...
- (js描述的)数据结构[栈结构](2)
(js描述的)数据结构[栈结构](2) 一.什么是栈结构 1.一种受限制的线性结构,这种结构可以基于数组来实现. 2.可以抽象成一个容器,上面的是栈顶,底下的是栈底.所以仅允许对栈顶进行操作, 二.栈 ...
- 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列
栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...
- openssl stack 数据结构栈基本操作
堆栈是两种不同的数据结构: 堆:数据先进先出: 栈:数据先进后观: 在stack.h 中 openssl 为我们提供了一个通用的栈,利用提供的接口我们可以方便的用此栈来存放开发中的任意数据. open ...
- JavaScript数据结构——栈和队列
栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...
随机推荐
- JVM学习第一天(虚拟机的前世今生与与Java的内存区域)
其实说JVM的时候有很多人会懵, 也很不理解,我会写Java代码就可以了,我干嘛要学这个,其实不是的,学习JVM是很有必要性的; 为什么要了解JVM 1:写出更好,更健壮的Java程序; 2:提高Ja ...
- shell小技巧(6)修改一批文件后缀
当前目录下后缀为sh的文件,改为后缀shell. 这里列出两种方法,先看第一种.方法1:#!/bin/bash str=`find ./ -name \*.sh` # 会产生一个列表 file=&q ...
- 软件定义网络实验(一)----Mininet源码安装和可视化拓扑工具
一.实验任务 掌握 Mininet 的源码安装方法和 miniedit 可视化拓扑生成工具. 二.实验任务 使用源码安装 Mininet 的 2.3.0d6 版本,并使用可视化拓扑工具生成一个最简拓扑 ...
- linux下设置账户锁定阈值:登录失败n次,多长时间后解锁重新登录
在centos系统下: 1.执行命令 vim /etc/pam.d/system-auth或vim /etc/pam.d/ login 2.执行命令 vim /etc/pam.d/sshd 3.在上面 ...
- burpsuite抓包乱码问题
网上百度说只需要Change Font选择中文字体即可,但是我这边试过还是乱码,按照网上一篇博客说抓包中按钮展示乱码的问题,在下面Character Sets选择Use a specific char ...
- linux定时重启服务器
需求说明 系统配置低了,且应用程序内一直在执行定时任务,在程序运行一段时间后,发现接口请求会变得很慢,需要每天定时凌晨重启服务器 脚本实现 1. linux 终端输入crontab -e,添加定时任务 ...
- 小白的springboot之路(十七)、阿里云OSS 的使用
0-前言 项目中,文件服务必不可少,常用的有各云服务商的OSS服务(如阿里云OSS,腾讯云OSS,七牛云).自建(fastDFS.minio): 推荐:如果用云服务的话,阿里云OSS很方便,如果自建的 ...
- 分布式系统监视zabbix讲解七之分布式监控
分布式监控 概述 Zabbix通过Zabbix proxy为IT基础设施提供有效和可用的分布式监控 代理(proxy)可用于代替Zabbix server本地收集数据,然后将数据报告给服务器. Pro ...
- IHttpClientFactory组件使用
起因 :由于需要前段时间写了一个http请求的公共方法 使用的 HttpClient,但是在jmeter测试下 爆发了这个问题:“Cannot assign requested address Ca ...
- RXJAVA之Subject
RxJava中常见的Subject有4种,分别是 AsyncSubject. BehaviorSubject.PublishSubject. ReplaySubject. AsyncSubject 使 ...