-
c#实现顺序栈
栈(Stack)是操作限定在表的尾端进行的线性表。表尾由于要进行插入、删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top),另一端是固定的,称为栈底(Bottom)。
栈相当与生活中洗盘子一样,把洗净的盘子一个接一个地往上放(相当于把元素入栈);取用盘子的时候,则从最上面一个接一个地往下拿(相当于把元素出栈)。
下面为栈的接口:
(IDS为各种数据结构的公共接口,包含Count(),IsEmpty(),Clear()三个操作,前面顺序表已经定义过)
using System;
using System.Collections.Generic;
using System.Text;
namespace DateStructrues
{
/// <summary>
/// 栈接口
/// </summary>
/// <typeparam name="T">泛型</typeparam>
public interface IStack<T> : IDS<T>
{
/// <summary>
/// 入栈操作
/// </summary>
/// <param name="item">泛型:要入栈的元素</param>
void Push(T item);
/// <summary>
/// 出栈操作
/// </summary>
/// <returns>出栈的元素</returns>
T Pop();
/// <summary>
/// 取栈顶元素
/// </summary>
/// <returns>取出的元素</returns>
T GetTop();
}
}
下面为栈的逻辑实现:
using System;
using System.Collections.Generic;
using System.Text;
namespace DateStructrues
{
/// <summary>
/// 顺序栈
/// </summary>
/// <typeparam name="T">泛型</typeparam>
class SeqStack<T> : IStack<T>
{
#region
//
//数组,存入数据
//
private T[] data;
//
//最大值
//
private int maxsize;
//
//栈顶
//
private int top;
/// <summary>
/// <value>
/// 获取或设置数组元素
/// </value>
/// </summary>
public T[] Data
{
get
{
return data;
}
}
/// <summary>
/// <value>
/// 获取或设置最大值
/// </value>
/// </summary>
public int Maxsize
{
get
{
return maxsize;
}
set
{
maxsize = value;
}
}
/// <summary>
/// <value>
/// 获取或设置栈顶元素
/// </value>
/// </summary>
public int Top
{
get
{
return top;
}
set
{
top = value;
}
}
/// <summary>
/// 无参构造器
/// </summary>
public SeqStack() : this(10) { }
/// <summary>
/// 构造器
/// </summary>
/// <param name="size">初始大小</param>
public SeqStack(int size)
{
data = new T[size];
maxsize = size;
top = -1;
}
#endregion
#region Method
/// <summary>
/// 判断栈是否为满
/// </summary>
public bool IsFull
{
get
{
return top == maxsize - 1;
}
}
#endregion
#region IStack<T> 成员
/// <summary>
/// 出栈操作
/// 如果data已满,top = maxsize - 1
/// data[++top] = item
/// </summary>
/// <returns>出栈的元素值</returns>
public T Pop()
{
T tmp = default(T);
//判断表是否为空
if (top == -1)
{
Console.WriteLine("栈为空");
return tmp;
}
tmp = data[top--];
return tmp;
}
/// <summary>
/// 入栈操作
/// </summary>
/// <param name="item">将入栈的值</param>
public void Push(T item)
{
if (top == maxsize - 1)
{
Console.WriteLine("栈为满");
return;
}
data[++top] = item;
}
/// <summary>
/// 获取栈顶元素
/// </summary>
/// <returns>栈顶元素值</returns>
public T GetTop()
{
if (top == -1)
{
Console.WriteLine("栈为空!");
return default(T);
}
return data[top];
}
#endregion
#region IDS<T> 成员
/// <summary>
/// 获取栈的长度
/// </summary>
public int Count
{
get
{
return top + 1;
}
}
/// <summary>
/// 清空操作
/// </summary>
public void Clear()
{
top = -1;
}
/// <summary>
/// <value>
/// 判断栈是否为空
/// 如果为top为-1,返回true
/// 否则,返回false
/// </value>
/// </summary>
public bool IsEmpty
{
get
{
return top == -1;
}
}
#endregion
}
}