C++实现栈

目录

一.顺序栈

二.链栈


栈的特点:先进后出


一.顺序栈

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类的封装性。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值