C#使用Object类实现栈的方法详解
作者:丛晓男 发布时间:2021-08-03 17:36:16
标签:C#,栈
本文实例讲述了C#使用Object类实现栈的方法。分享给大家供大家参考,具体如下:
Stack类的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 使用Object类实现后进先出队列
{
class Stack
{
private Object[] _items;
public Object[] Items
{
get { return this._items; }
set { this._items = value; }
}
//将对象压入
public void Push(Object obj)
{
//第一次压入时,进行初始化,长度为1
if (this._items == null)
{
this._items = new Object[1];
this._items[0] = obj;
}
else
{
int count = this._items.Length;
Object[] objTemp = this._items;
this._items = new Object[count + 1];
int i = 0;
foreach (Object o in objTemp)
{
this._items[i++] = o;
}
this._items[i] = obj;
}
}
//按后入先出取出
public Object Pop()
{
//为初始化或长度为0时,无法取出任何元素
if (this._items == null||this._items.Length == 0)
return null;
else
{
Object obj = this._items[this._items.Length - 1];
//删除最后一个元素
this.DeleteLastObj();
return obj;
}
}
private void DeleteLastObj()
{
Object[] objTemp = new Object[this._items.Length - 1];
for (int i = 0; i < this._items.Length - 1; i++)
{
objTemp[i] = this._items[i];
}
this._items = objTemp;
}
}
}
窗体检测代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace 使用Object类实现后进先出队列
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Stack stack = new Stack();
private Stack<string> stackGeneric= new Stack<string>();
private void button1_Click(object sender, EventArgs e)
{
stack.Push(this.textBox1.Text);
}
private void button2_Click(object sender, EventArgs e)
{
Object[] objs = stack.Items;
foreach(Object o in objs)
{
Console.WriteLine(o.ToString());
}
}
private void button1_Click_1(object sender, EventArgs e)
{
try
{
Console.WriteLine(this.stack.Pop().ToString());
}
catch
{
Console.WriteLine("null");
}
}
private void button3_Click(object sender, EventArgs e)
{
this.stackGeneric.Push(this.textBox2.Text);
}
private void button4_Click(object sender, EventArgs e)
{
try
{
Console.WriteLine(this.stackGeneric.Pop());
}
catch (InvalidOperationException)
{
Console.WriteLine("null");
}
}
}
}
1.使用Stack类的时候形成很多不可控的资源占用,等待GC回收;
2.类型不安全,任何类型的数据都可以装入object
3.可以设置Object数组的一个初始长度,而不必每次压入或者取出的时候都去临时改变数组的长度,具体做法是,通过Stack的构造函数生成一个指定长度的数组,在压入和取出的时候,并不对这个初始化的长度进行调整,而只是用一个int数值intPoint记录目前所拥有的值的位置,对已经取出的object,实际并没有把它删除,只是不去管它而已。这样做的好处是,一次设定数组长度,使用一个类似指针的东西定位“有效”元素,这种方法更可取。
实际上,.net2.0以上提供了Stack<>泛型类可以直接完成栈,使用非常方便,而且避免了强制类型转换带来的损耗,实现了类型安全。第二段代码中已经给出使用方式,非常简单。
希望本文所述对大家C#程序设计有所帮助。


猜你喜欢
- 本文实例为大家分享了Android高德地图marker自定义弹框窗口的具体代码,供大家参考,具体内容如下最终效果:1.gradle里添加高德
- 前言RefreshIndicator是Flutter里常见的下拉刷新组件,使用是比较方便的。但由于产品兄弟对其固定的刷新样式很是不满,而且代
- Android WebView或手机浏览器打开连接问题解决办法总结1.通常情况下 大家可能都想使用WebView打开网页内部链接而不想再调用
- 一.前言在日常的开发中,经常需要对方法参数进行校验(非空、长度等)。如果采用hardcode去校验(if..else..),会造成代码冗余,
- 本文实例讲述了C#中线程同步对象的方法。分享给大家供大家参考。具体分析如下:在编写多线程程序时无可避免会遇到线程的同步问题。什么是线程的同步
- 正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径,即相对于当前类的路径。在本地工程和服务
- SpringBoot分离打Jar包的两种方式方式一:基于maven-jar-plugin此方式基于这个小伙伴的配置改的:https://ww
- 罗马数字转整数罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
- 最近在学ssh,一直搞不懂$,%,#的区别,做了点小练习,慢慢也懂了一点,将自己所学的也记录下来吧。 存在一下一个实
- 它所表示的是“这部分是无法修改的”。不想被改变的原因有两个:效率、设计。使用到final的有三种情况:数据、方法、类。一、 final数据有
- JPA连接到数据库,调用存储过程,这样的需求很常见。本文就针对这一点,讲述如何使用spring Data JPA调用存储过程的方法。1、存储
- 举一个生活中的小例子,大凡开过学或者毕过业的都会体会到这样一种郁闷:你要去 n个地方办理 n 个手续(现在大学合并后就更加麻烦,因为可能那
- import java.io.File;import java.io.FileNotFoundException;import java.i
- BASE64 编码是一种常用的字符编码,在很多地方都会用到。但base64不是安全领域下的加密解密算法。能起到安全作用的效果很差,而且很容易
- 本文实例讲述了C#正则表达式匹配与替换字符串功能。分享给大家供大家参考,具体如下:事例一:\w+=>[A-Za-z1-9_],\s+=
- 我相信现在绝大部分App几乎避免不了消息推送,其实原理还是使用了长连接,通过服务端将消息推给客户端。市面上也有不少三方库,例如极光、友盟、个
- 问题:Information:java: Errors occurred while compiling module &lsquo
- 问题描述Spring Cache提供的@Cacheable注解不支持配置过期时间,还有缓存的自动刷新。我们可以通过配置CacheManneg
- 有时候需要根据条件查询得出的数据较多,需要分页显示到页面上。这时点击下一页就不方便每次带查询条件在数据库中分页。可以在list中进行分页。p
- B/S 系统中对http 请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺