8.顺序栈类

namespace DSList
{
    public partial class SeqStack<T> : IStack<T> where T:IComparable<T>
    {
        /// <summary>
        /// fields
        /// </summary>
        private int maxsize;
        private T[] data;
        private int top;
        /// <summary>
        /// properties
        /// </summary>
        public int Maxsize
        {
            get
            {
                return maxsize;
            }
            set
            {
                maxsize = value;
            }
        }
        public T this[int index]
        {
            get 
            {
                return data[index];
            }
            set
            {
                data[index] = value;
            }
        }
        public int Top
        {
            get
            {
                return top;
            }
        }
        /// <summary>
        /// constructors
        /// </summary>
        public SeqStack()
            : this(100)
        { }
        public SeqStack(int size)
        {
            data = new T[size];
            maxsize = size;
            top = -1;
        }
        /// <summary>
        /// base methods
        /// </summary>
        public int GetLength()
        {
            return top+1;
        }
        public bool IsEmpty()
        {
            if (top == -1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public bool IsFull()
        {
            if (top == maxsize-1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public void Clear()
        {
            top = -1;
        }
        public void Push(T item)
        {
            if (IsFull())
            {
                Console.WriteLine("SeqStack is full!");
                return;
            }
            data[++top] = item;
            
        }
        public T Pop()
        {
            if (IsEmpty())
            {
                Console.WriteLine("SeqStack is empty!");
                return default(T) ;
            }
            T tmp = data[top];
            --top;   
            return tmp;
        }
        public T GetTop()
        {
            if (IsEmpty())
            {
                Console.WriteLine("SeqStack is empty!");
                return default(T);
            }
            return data[top];
        }
    }
    public partial class SeqStack<T> : IStack<T> where T : IComparable<T>
    {
        /// <summary>
        /// others methods
        /// </summary>
        public bool Contains (T item)
        {
            for (int i = 0; i <= top; ++i)
            {
                if (data[i].Equals(item))
                {
                    return true;
                }
            }
            return false;
        }
        public void Reverse()
        {
            T temp = default(T);
            int len = GetLength() - 1;
            for (int i = 0; i <= len/2; ++i)
            {
                temp = data[top - i];
                data[top - i] = data[i];
                data[i] = temp;
            }
        }
        public void Merge(SeqStack<T> S1, SeqStack<T> S2)
        {
            this.Maxsize = S1.Maxsize + S2.Maxsize;
            int i = 0;
            int j = 0;
            while (i < S1.GetLength() && j < S2.GetLength())
            {
                if (S1[i].CompareTo(S2[j]) < 0)
                {
                    this.Push(S1[i++]);
                }
                else
                {
                    this.Push(S2[j++]);
                }
            }
            while (i < S1.GetLength())
            {
                this.Push(S1[i++]);
            }
            while (j < S2.GetLength())
            {
                this.Push(S2[j++]);
            }
        }
        public void Purge(SeqStack<T> S)
        {
            this.Maxsize = S.Maxsize;
            this.Push(S[0]);
            for (int i = 1; i < S.GetLength(); ++i)
            {
                int j = 0;
                for (j = 0; j < this.GetLength(); ++j)
                {
                    if (S[i].Equals(data[j]))
                    {
                        break;
                    }
                }
                if (j > this.GetLength() - 1)
                {
                    this.Push(S[i]);
                }
            }
            
        }
        public void Sort()
        {
            T tmp = default(T);
            for (int i = 0; i < GetLength(); i++)
            {
                for (int j = i+1; j < GetLength(); j++)
                {
                    if (data[i].CompareTo(data[j]) > 0) 
                    {
                        tmp = data[j];
                        data[j] = data[i];
                        data[i] = tmp;
                    }
                }
            }
        }
        public void Output()
        {
            foreach(T i in data)
            {
                Console.Write(i+" ");
            }
            Console.WriteLine();
        }
    }
}
posted @ 2011-03-27 00:50  山之松  阅读(149)  评论(0编辑  收藏  举报