软件编程
位置:首页>> 软件编程>> C#编程>> C#使用Object类实现栈的方法详解

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#程序设计有所帮助。

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com