“栈压嘉陵咽,峰横剑阁长
什么是栈?
顾名思义,栈就是栈,储存货物的房间。你想把一些货物放到这个房间里,为了让房间可以存放更多的货物,那就开始的时候把货物放到房间的最里面。然后取货物的时候从房间最外面开始取。在计算机中的栈也想这样,它只不过是一种存储数据的结构思路,把这种方法给数据化、代码化了。
如何通过面向对象的方式实现栈?
怎么实现?思路很简单:要考虑栈需要哪些成员变量哪些成员函数。实现一个简单的栈类,可以通过以下代码:
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];
}
}