简单的自定义实现Stack模板(顺序栈以及链式栈没有迭代器和销毁)

来源:互联网 发布:沪江网络课程 编辑:程序博客网 时间:2024/06/07 21:51
*****************************************************************************************
用类和模板实现栈的操作






*****************************************************************************************/
#include<iostream>
#define MAX_SIZE 100
using namespace std;
template <typename T>
struct LStack
{
T  Data;
LStack<T> *pnext;
LStack(T Data, LStack<T>* pnext) :Data(Data), pnext(pnext){}
};
template<typename T>
class Stack//顺序栈
{
public:
  Stack(T size)//初始化栈
{
Top=0;
_SIZE = size;
Data = new T[size];
}
  friend ostream &operator <<(ostream &a, T &b)
  {
  a << b;
  }
T Push(T data)//压栈
{
if (Top >= _SIZE - 1)
{
cout << "栈已满" << endl;
return 0;
}
else
{
Data[Top++] = data;
return 1;
}
}
T OutStack(T* data)//出栈
{
if (Top <= 0)
{
cout << "栈空!" << endl;
return 0;
}
else
{
*data = Data[Top - 1];
Data[Top-- - 1].~T();//一块T类型内存析构
return 1;
}
}
protected:
T _SIZE;//栈容量
T Top;//栈顶
T* Data ;//顺序栈数组指针
private:
};
template <typename T>
class ListStack//链式栈
{
public:
ListStack()//初始化栈
{
Top = 0;
phead = NULL;
}
~ListStack()//析构
{
while (phead)
{
LStack<T>*pthis = phead;
phead = phead->pnext;
delete pthis;
}
}
void PushStack(T data)//压栈
{
phead = new LStack<T>(data, phead);
Top++;
}
void PopStack(T *data)//出栈
{
if (phead == NULL)
{
cout << "栈空" << endl;
}
else
{
*data = phead->Data;
LStack<T>* pthis = phead;
phead = phead->pnext;
delete  pthis;
Top--;
}
}
protected:
T Top;
LStack<T>* phead;
private:
};
int main()
{
Stack<int> mystack(MAX_SIZE);//创建对象
int data;
for (int i = 0; i < 10; ++i)
{
mystack.Push(i*i);//压栈
cout << i *i<< endl;
}
cout << endl << endl;
for (int i = 0; i < 10; ++i)
{
mystack.OutStack(&data);//出栈
cout << data << endl;
}
cout << endl << endl;
ListStack<int> myliststack;
int Ldata;
for (int i = 0; i < 10; ++i)
{
myliststack.PushStack(i*i);//压栈
cout << i*i << endl;
}
cout << endl << endl;
for (int i = 0; i < 10; ++i)
{
myliststack.PopStack(&Ldata);//出栈
cout <<Ldata << endl;
}
system("pause");
return 0;
}
原创粉丝点击