#include <iostream>
using namespace std;
//利用顺序表实现栈
#if 0
template <class T>
class Stack
{
public:
Stack()
:_ptr(new T[3])
, _capacity(3)
, _size(0)
{}
Stack(const T*arr, size_t sz)
:_ptr(new T[sz])
, _capacity(sz)
, _size(sz)
{
for (size_t i = 0; i < sz; i++)
{
_ptr[i] = arr[i];
}
}
//元素入栈
void Push(T data)
{
IncreaseCapacity();
_ptr[_size] = data;
_size++;
}
//元素出栈
T& Pop()
{
return _ptr[_size-1];
_size--;
}
//判空
bool Empty()
{
if (Size())
return true;
return false;
}
size_t Capacity()
{
return _capacity;
}
//获取大小
size_t Size()
{
return _size;
}
//获取栈顶元素
size_t Top()
{
return _ptr[_size-1];
}
~Stack()
{
delete [] _ptr;
_ptr = NULL;
}
private:
//增容
void IncreaseCapacity()
{
size_t sz = Size();
size_t capacity = Capacity();
size_t newsize = capacity * 2 + 3;
if (sz >= capacity)
{
T*newptr = new T[newsize];
for (int i = 0; i < sz; i++)
{
newptr[i] = _ptr[i];
}
delete[] _ptr;
_ptr = newptr;
_capacity = newsize;
}
}
private:
T* _ptr;
size_t _capacity;
size_t _size;
};
void test()
{
int arr[3] = { 1, 2, 3 };
int sz = sizeof(arr) / sizeof(arr[0]);
Stack<int>s1;
Stack<int>s2(arr, sz);
s2.Push(4);
s2.Push(5);
cout<<s2.Empty()<<endl;
cout<<s2.Pop()<<endl;
cout<<s2.Size()<<endl;
cout<<s2.Top()<<endl;
}
#endif
//模板参数
#include "List.h"
#include "Vector.h"
#if 0
template<class T,class Container=Vector<T>>
class Stack
{
public:
Stack()
{
}
//入栈
void Push(const T&data)
{
V.PushBack(data);
}
//出栈
T& Pop()
{
return V.Back();
V.PopBack();
}
//判空
bool Empty()const
{
return V.Empty();
}
//栈顶
const T& Top()
{
return V.Back();
}
size_t Size()const
{
return V.Size();
}
~Stack()
{
}
private:
Container V;
};
void test()
{
// Stack<int, List<int>>s1;
Stack<int>s1;
cout<<s1.Empty()<<endl;
s1.Push(4);
s1.Push(5);
s1.Push(6);
cout<<s1.Size()<<endl;
cout << s1.Top() << endl;
cout << s1.Pop() << endl;
}
int main()
{
test();
system("pause");
return 0;
}
#endif
//模板的模板参数
#if 0
template<class T,template<class >class Container=Vector>
class Stack
{
public:
Stack()
{
}
//入栈
void Push(const T&data)
{
V.PushBack(data);
}
//出栈
T& Pop()
{
return V.Back();
V.PopBack();
}
//判空
bool Empty()const
{
return V.Empty();
}
//栈顶
const T& Top()
{
return V.Back();
}
size_t Size()const
{
return V.Size();
}
~Stack()
{
}
private:
Container<T> V;
};
void test()
{
//Stack<int, List>s1;
Stack<int>s1;
cout << s1.Empty() << endl;
s1.Push(4);
s1.Push(5);
s1.Push(6);
cout << s1.Size() << endl;
cout << s1.Top() << endl;
cout << s1.Pop() << endl;
}
#endif
//队列
template<class T,class Container=List<T>>
class Queue
{public:
Queue()
{}
~Queue()
{}
//入对列
void Push(const T&data)
{
V.PushBack(data);
}
//出队列
T& Pop()
{
return V.Back();
V.PopFront();
}
//判空
bool Empty()const
{
return V.Empty();
}
size_t Size()const
{
return V.Size();
}
private:
Container V;
};
void test()
{
//Stack<int, List>s1;
Queue<int>s1;
cout << s1.Empty() << endl;
s1.Push(4);
s1.Push(5);
s1.Push(6);
cout << s1.Size() << endl;
cout << s1.Pop() << endl;
}
int main()
{
test();
system("pause");
return 0;
}
template<class T,class Container=Vector<T>>
class Stack
{
public:
Stack()
{
}
//入栈
void Push(const T&data)
{
V.PushBack(data);
}
//出栈
T& Pop()
{
return V.Back();
V.PopBack();
}
//判空
bool Empty()const
{
return V.Empty();
}
//栈顶
const T& Top()
{
return V.Back();
}
size_t Size()const
{
return V.Size();
}
~Stack()
{
}
private:
Container V;
};
void test()
{
// Stack<int, List<int>>s1;
Stack<int>s1;
cout<<s1.Empty()<<endl;
s1.Push(4);
s1.Push(5);
s1.Push(6);
cout<<s1.Size()<<endl;
cout << s1.Top() << endl;
cout << s1.Pop() << endl;
}
int main()
{
test();
system("pause");
return 0;
}
#endif
//模板的模板参数
#if 0
template<class T,template<class >class Container=Vector>
class Stack
{
public:
Stack()
{
}
//入栈
void Push(const T&data)
{
V.PushBack(data);
}
//出栈
T& Pop()
{
return V.Back();
V.PopBack();
}
//判空
bool Empty()const
{
return V.Empty();
}
//栈顶
const T& Top()
{
return V.Back();
}
size_t Size()const
{
return V.Size();
}
~Stack()
{
}
private:
Container<T> V;
};
void test()
{
//Stack<int, List>s1;
Stack<int>s1;
cout << s1.Empty() << endl;
s1.Push(4);
s1.Push(5);
s1.Push(6);
cout << s1.Size() << endl;
cout << s1.Top() << endl;
cout << s1.Pop() << endl;
}
#endif
//队列
template<class T,class Container=List<T>>
class Queue
{public:
Queue()
{}
~Queue()
{}
//入对列
void Push(const T&data)
{
V.PushBack(data);
}
//出队列
T& Pop()
{
return V.Back();
V.PopFront();
}
//判空
bool Empty()const
{
return V.Empty();
}
size_t Size()const
{
return V.Size();
}
private:
Container V;
};
void test()
{
//Stack<int, List>s1;
Queue<int>s1;
cout << s1.Empty() << endl;
s1.Push(4);
s1.Push(5);
s1.Push(6);
cout << s1.Size() << endl;
cout << s1.Pop() << endl;
}
int main()
{
test();
system("pause");
return 0;
}