数据结构 动态可调数组 顺序栈

来源:互联网 发布:柠檬免费网络电视 编辑:程序博客网 时间:2024/04/30 09:01
#include <assert.h>
#include <iostream>
using namespace std;
const int INC_SIZE = 20; //自动扩容增量
template <class T> class SeqStack {
private:
    T *elements;  // 栈元素数组
    int top;             // 栈顶指针
    int maxSize;    // 栈最大容量
    void _OverflowProcess();  // 自动溢出处理
public:
    SeqStack ( int sz = 50 );    //构造函数
    SeqStack (SeqStack<T>& s);  //复制构造函数
    ~SeqStack ( ) { delete [ ] elements; }
    void Push (const T & item);    //进栈
    T Pop();   // 出栈,更合理的接口设计
    T& Top(){return elements[top];}; //取栈顶元素,与C++标准库一致
    int GetSize() {return top + 1; } //取元素数量
    bool IsEmpty ( ) const { return top == -1; }
    bool IsFull( ) const {return top==maxSize?false:true;}
    void MakeEmpty ( ) { top = -1; }   //清空栈
    SeqStack<T>& operator=(SeqStack<T>& s);
    int GetMaxSize() const {return maxSize;}
    T Locate(int i) const {return elements[i];}
};
template <class T>
SeqStack<T> ::SeqStack ( int sz ) : top (-1), maxSize (sz) {//默认初始化
    elements = new T[maxSize];
    //C++断言,若内存分配失败则终止运行:
    assert ( elements != NULL );
}
template <class T>
SeqStack<T> ::SeqStack (SeqStack<T>& s){
top=s.GetSize()-1;
maxSize=s.GetMaxSize();
elements=new T[maxSize];
assert (elements != NULL);
for(int i=0;i<=top;i++)
{
   elements[i]=s.Locate(i);
}
}
template <class T>
void SeqStack<T> ::Push (const T & item){
    if(IsFull()) _OverflowProcess();
    elements[top+1]=item;
    top=top+1;
}
template <class T>
T SeqStack<T> ::Pop(){
    T ret;
if (top >= 0) ret = elements[top--]; //退出栈顶元素
    return ret;
return ret;
}
template <class T>
SeqStack<T>& SeqStack<T> ::operator=(SeqStack<T>& s){
maxSize=s.maxSize;
elements=new T[maxSize];
top=s.GetSize()-1;
for(int i=0;i<top;i++)
{
    elements[i]=s.Locate(i);
}
delete[] elements;
}
template <class T> void SeqStack<T> ::
_OverflowProcess () {
    // 私有成员函数:栈满时扩容
    T* newArray=new T[maxSize + INC_SIZE];
    assert(newArray!=NULL); //断言内存分配成功
    for(int i=0; i<=top; i++)
        newArray[i]=elements[i]; // 复制原有数据
    maxSize += INC_SIZE;
    delete[] elements;        // 释放原数组
    elements = newArray; // 指向新数组
}


int main()
{
    SeqStack <int>mystack;
    for(int i=0;i<10;i++)
    mystack.Push(i);
    for(int i=9;i>=0;i--)
    cout<<mystack.Locate(i)<<" ";
    cout<<endl;


    SeqStack <int>mystack2=mystack;
    for(int i=0;i<10;i++)//测试
    cout<<mystack2.Pop()<<" ";
    cout<<endl;


    SeqStack <int>mystack3;
    for(int i=0;i<10;i++)
    mystack3.Push(i);
    for(int i=9;i>=0;i--)
    cout<<mystack.Locate(i)<<" ";
    cout<<endl;




    mystack3=mystack;
    for(int i=0;i<10;i++)
    mystack3.Push(i);
    for(int i=9;i>=0;i--)
    cout<<mystack.Locate(i)<<" ";
    cout<<endl;


    return 0;

}


还有许多细节没补充










0 0