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)的有序集合 --------------------------------------------------------------- ...
随机推荐
- Activiti7 组任务
需求:在流程定义中在任务节点的assignee固定设置任务负责人,这种情况不是很好,如果有天任务负责人请假了,你想请假,等着吧..没人审批,针对这种情况,可以给任务设置多个候选人,可以从候选中选择参与 ...
- 让mvn打包时跳过Junit测试
原来在使用命令 “mvn clean package” 发生了测试报错,说是几个testcase出现问题了. 另一方催jar得紧,于是用 命令 “mvn package -DskipTests”,只让 ...
- 索引对单列极值查询的显著性影响(百万级别表单列最值查询 Cost由1405变成3)
表结构: create table hy_emp( id number(7,0) primary key, name nvarchar2(20) not null, salary number(5,0 ...
- sqlserver语句的执行顺序
执行顺序: 1.from 2.where 3.group by 4.having 5.根据select 关键之后的要显示的字段,进行结果集显示 6.order by 对最终结果集进行排序 7.top/ ...
- vue.js 的安装
包含vue的脚手架的安装. 1,到项目目录下输入 cnpm i -g vue-cli 2,安装完毕后咱们看看.输入 vue 即可看到vue的安装情况. 3,输入 vue list 即可看到框架的选择 ...
- 搭建MQTT学习平台
关于MQTT协议的介绍就不赘述了,网上资料非常多,直接入正题. MQTT协议的实现非常多,我选择了一个非常轻量级的开源项目来学习MQTT协议——mosquitto,官网:www.mosquitto.o ...
- 图解 Await 和 Async
原文链接:Await and Async Explained with Diagrams and Examples 文章目录 简介 Promise 问题:组合 Promise Async 函数 Awa ...
- JS将数字转换为中文
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Js获取某个节点的类名
1. document.querySelectorAll(".style-color")[0].getAttribute("class") 2. $('.s ...
- Angular用户输入
用户输入 事件绑定 使用 (event) on-event 概念 用户操作 -> DOM事件 用户操作 点击链接 按下按钮 输入文字 DOM事件 $event 类型 any 不能推测属性 可 ...