棧(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
}
}