C# 数据结构与算法系列(四) 栈

本文详细介绍了栈这种数据结构的概念及其实现方式。栈是一种特殊的线性表,遵循后进先出的原则,主要介绍栈的基本操作如进栈(PUSH)与退栈(POP),并提供了一个具体的栈实现案例。
栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来,它只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往堆。取走时,只能从上面一件一件取。堆和取都在顶部进行,底部一般是不动的。

栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。

1、进栈(PUSH)算法
1、若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
2、置TOP=TOP+1(栈指针加1,指向进栈地址);
3、S(TOP)=X,结束(X为新进栈的元素);

2、退栈(POP)算法
1、若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
2、X=S(SOP),(退栈后的元素赋给X);
3、TOP=TOP-1,结束(栈指针减1,指向栈顶)。

下面看一下栈的实现接口:
   public interface IStack<T>
   {
       
int Length();
       
bool IsEmpty();
       
void Clear();
       
void Push(T items);
       T Pop();
       T GetPopValue();
   }

下面的代码是栈的实现的类:
ContractedBlock.gifExpandedBlockStart.gifCode

   
public class JStack<T> : IStack<T>
   {
       
private int size;
       
private T[] item;
       
private int top; 

       
public T this[int index]
       {
           
get { return item[index]; }
           
set { item[index] = value; }
       } 

       
public int Size
       {
           
get { return size; }
           
set { size = value; }
       } 

       
public int Top
       {
           
get { return top; }
       }

 

       
public JStack(int length)
       {
           top 
= -1;
           size 
= length;
           item 
= new T[length];
       } 

       
public int Length()
       {
           
return top + 1;
       }       

       
public bool IsEmpty()
       {
           
return (top == -1);
       } 

       
public void Clear()
       {
           top 
= -1;
       } 

       
public void Push(T items)
       {
           
if (top < size - 1)
           {
               item[
++top] = items;
           }
       } 

       
public T Pop()
       {
           T tmp 
= default(T);
           
if (!IsEmpty())
           {
               tmp 
= item[top];
           }
           
return tmp;
       } 

       
public T GetPopValue() 
       {
           
if (IsEmpty())
           {
               
throw new ArgumentNullException("栈已经为空""Item Null");
           }
           
return item[top];
       }
    }


下面进行测试:

      

ContractedBlock.gifExpandedBlockStart.gifCode
           try
           {
               JStack
<string> js = new JStack<string>(20);
               Console.WriteLine(
"------栈刚初始化完成----");
               Console.WriteLine(js.Length());
               Console.WriteLine(js.IsEmpty().ToString());
               js.Push(
"A");
               js.Push(
"B");
               js.Push(
"C");
               js.Push(
"D");
               Console.WriteLine(
"------栈已经插入数据----");
               Console.WriteLine(js.Length());
               Console.WriteLine(js.IsEmpty().ToString());

               Console.WriteLine(
"------取栈顶数据----");
               Console.WriteLine(js.GetPopValue().ToString());

               Console.WriteLine(
"------清栈----");
               js.Clear();
               Console.WriteLine(js.GetPopValue().ToString());
               Console.ReadLine();
           }
           
catch (Exception ex)
           {
               Console.WriteLine(ex.Message);
               Console.ReadLine();
           } 


当你需要把对象的顺序反过来的时候,你就可以按顺序把对象放栈里,然里再从栈里取出来,这时功能就实现了。











转载于:https://www.cnblogs.com/whtydn/archive/2009/07/31/1536266.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值