震惊!栈的实现原来……?!

“栈压嘉陵咽,峰横剑阁长 ” ——唐·杜牧

什么是栈?

          顾名思义,栈就是栈,储存货物的房间。你想把一些货物放到这个房间里,为了让房间可以存放更多的货物,那就开始的时候把货物放到房间的最里面。然后取货物的时候从房间最外面开始取。在计算机中的栈也想这样,它只不过是一种存储数据的结构思路,把这种方法给数据化、代码化了。

如何通过面向对象的方式实现栈?

           怎么实现?思路很简单:要考虑栈需要哪些成员变量哪些成员函数。实现一个简单的栈类,可以通过以下代码:

class MyStack
{
public:
	MyStack(int size); //分配内存初始化栈空间,设定栈容量,栈顶
	~MyStack();//回收栈空间内存
	bool stackEmpty();//判空
	bool stackFull();//判满
	void clearStack();//清空栈
	int stackLength();//已有元素个数
	void push(char elem);//元素入栈,栈顶上升
	void pop(char &elem);//元素出栈,栈顶下降
	void stackTraverse();//遍历栈中所有的元素
private:
	char *m_pBuffer;//栈空间指针
	int m_iSize;//栈容量
	int m_iTop;//栈顶,栈中元素的个数
};

详解:

          先说一下成员变量:首先需要一个指针变量来指向你所申请的用来实现栈的内存。其次需要两个整形变量分别存储栈的容量和栈顶位置,其中栈顶位置又可以巧妙地表示栈中现有元素地个数(巧妙之处留给小伙伴们自做思考)。
          再说一下成员函数:首先是构造函数和析构函数,很明显你需要在构造函数中申请所需大小内存和初始化成员变量、在析构函数中释放内存。另外为了代码有一丝丝地健壮性需要在一些函数中进行判空判满操作,所以就需要两个函数来判断栈是否是满的或者空的。除了这些,为了栈的反复利用,可以实现清除栈元素功能的函数。根据面向对象地封装特性,可以设计一个get函数获取栈内现有元素的个数。最后,必不可少的是压栈、弹栈、和遍历栈内的元素的函数。

成员函数的实现:

          成员函数的实现颇为清晰明了,在此我就不加赘述,请小伙伴们看着注释细细品味其中的奥妙,这对你们成长颇有益处哦~

//  MyStack.cpp    
//  C语言文件复制操作    
//  Created by Coral on 2017/4/14.    
//  Copyright © 2017年 Scarborough_Coral. All rights reserved.    
//   

#include "MyStack.h"
#include <iostream>

using namespace std;

MyStack::MyStack(int size)
{
	m_pBuffer = new char[size];
	m_iSize = size;
	m_iTop = 0;
}

MyStack::~MyStack()
{
	delete[]m_pBuffer;
	m_pBuffer = nullptr;
}

bool MyStack::stackEmpty()
{
	if (m_iTop == 0)
	{
		return true;
	}
	return false;
}

bool MyStack::stackFull()
{
	if (m_iTop == m_iSize)
	{
		return true;
	}
	return false;
}

void MyStack::clearStack()
{
	m_iTop = 0;
}

int MyStack::stackLength()
{
	return m_iTop;
}

void MyStack::push(char elem)
{
	if (stackFull())
	{
		return;
	}
	m_pBuffer[m_iTop] = elem;
	m_iTop++;
}

void MyStack::pop(char & elem)
{
	
	if (stackEmpty())
	{
		return;
	}
	m_iTop--;
	elem = m_pBuffer[m_iTop];
	return;
}

void MyStack::stackTraverse()
{
	for (int i = 0; i < stackLength(); i++)
	{
		cout << " " << m_pBuffer[i];
	}
}


         到今天为止,队列和栈的博文已经写完了,如果想了解环形队列的,可以看震惊篇(一)……

啦啦啦~~~



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值