目录
栈的特点:先进后出
一.顺序栈
class Stack
{
public:
Stack()
{
parr = new int[2]();//初始化栈的大小为2
top = 0;
totalsize = 2;
}
Stack(const Stack& rhs)
{
//深拷贝
parr = new int[rhs.totalsize]();
memcpy(parr, rhs.parr, sizeof(int)*rhs.top);
top = rhs.top;
totalsize = rhs.totalsize;
}
Stack& operator=(const Stack& rhs)
{
if (this != &rhs)
{
delete[] parr;
parr = new int[rhs.totalsize]();
memcpy(parr, rhs.parr, sizeof(int)*rhs.top);
top = rhs.top;
totalsize = rhs.totalsize;
}
return *this;
}
~Stack()
{
delete[] parr;
parr = NULL;
}
void push(int val)//入栈
{
if (full())//判满操作
{
resize();
}
parr[top++] = val;
}
void pop()//出栈
{
if (empty())//如果栈为空,则抛出异常
{
throw std::exception("stack is empty!");
}
top--;
}
bool empty()//判空
{
return top == 0;
}
int gettop()//获取栈顶元素
{
if (empty())//如果栈为空,则抛出异常
{
throw std::exception("stack is empty!");
}
return parr[top - 1];
}
private:
bool full()//判满
{
return top == totalsize;
}
void resize()//扩容,如果栈满了,就将它的大小扩大为原来的2倍
{
int* pnewspace = new int[totalsize * 2]();
memcpy(pnewspace, parr, sizeof(int)*totalsize);
delete[] parr;
parr = pnewspace;
totalsize *= 2;
}
int* parr;//存放数据的数组
int top;//栈顶
int totalsize;//栈的总容量
};
二.链栈
class CLink
{
public:
CLink()
{
phead = new Node();
}
~CLink()
{
Node* pCur = phead;
Node* pNext;
while (pCur != NULL)
{
pNext = pCur->pnext;
delete pCur;
pCur = pNext;
}
phead = NULL;
}
void Push(int val);
int Pop();
void Show();
private:
class Node//局部类(对于CLink类来说)
/*这里的Node相当于节点类*/
{
public:
Node(int val = 0);
public:
int mdata;//数据域
Node* pnext;//指针域
};
Node* phead;//头节点
};
void CLink::Push(int val)
{
Node* pnewnode = new Node(val);
pnewnode->pnext = phead->pnext;
phead->pnext = pnewnode;
}
int CLink::Pop()
{
Node* pnewnode = phead->pnext;
int temp = pnewnode->data;
phead->pnext = pnewnode->pnext;
delete pnewnode;
return temp
}
void CLink::Show()
{
Node* pCur = phead->pnext;
while (pCur != NULL)
{
std::cout << pCur->mdata << " ";
pCur = pCur->pnext;
}
std::cout << std::endl;
}
CLink::Node::Node(int val):mdata(val), pnext(NULL)
{}
/*将节点的数据域的值置为val,指针域指向NULL
且要注意Node类是CLink类的私有成员,
所以在类外实现Node类的成员函数时,成员函数前面的空间域要写为
CLink::Node::............模式*/
这里之所以把Node类设为CLink类的局部类,而没有设为友元类,是因为如果把Node设为CLink的友元类会破环CLink类的封装性。