数据结构:栈Stack的实现与代码分析
栈的主要特点是LIFO,后进先出。
只能访问栈顶。
可以使用数组或者链表来实现。
所以写了两个版本的实现。
其实,从代码的角度看,直接使用List是最简单的,但是从效率的角度看,使用vector更加高效一点。
对于List和Vector,都是使用自己实现的简单模板。Vector模板的实现 List模板的实现
先看看代码:
//
// Stack.h
// HelloWorld
// csdn blog:http://blog.csdn.net/u012175089
// Created by feiyin001 on 17/1/8.
// Copyright (c) 2017年 FableGame. All rights reserved.
//
#ifndef __HelloWorld__Stack__
#define __HelloWorld__Stack__
#include "List.h"
#include "Vector.h"
namespace Fable
{
//用链表实现的栈,其实比较少用的,所以叫做ListStack
template<typename Object>
class ListStack
{
public:
//只能向栈顶插入数据
void push(const Object& obj)
{
_list.push_back(obj);//把数据放到链表末尾
}
//弹出栈顶数据
void pop()
{
_list.pop_back();//弹出list的末尾的数据
}
//获得栈顶的数据
Object& top()
{
return _list.back();//获得list最后的数据
}
//判断为空
bool empty()
{
return _list.empty();//直接返回list是否为空
}
//获得栈的大小
int size()
{
return _list.size();//返回list的大小
}
private:
List<Object> _list;//链表实现
};
//用vector实现的栈,因为觉得以后用得比较多,所以直接叫做Stack了
template<typename Object>
class Stack
{
public:
//压入数据
void push(const Object& obj)
{
_theArray.push_back(obj);//把数据放到vector末尾
}
//弹出数据
void pop()
{
_theArray.pop_back();//弹出vector最后的数据
}
//返回栈顶的数据
Object& top()
{
return _theArray.back();//返回vector最后一个数据
}
//判断栈是否为空
bool empty()
{
return _theArray.empty();//返回vector是否为空
}
//返回栈的大小
int size()
{
return _theArray.size();//返回vector的大小
}
private:
Vector<Object> _theArray;//vector实现
};
}
#endif /* defined(__HelloWorld__Stack__) */
再补充一下,两个Stack模板类,都没有实现自己的构造函数,复制构造函数,复制赋值运算符,析构函数等。因为所使用的list和vector都是已经实现了可复制的。
而且自身也没有新的属性,所以就不需要自己去实现了。
再补充一下看到的知识点:
尾递归,指在最后一行的递归调用。
人生如戏,还是戏如人生?微信公众号:传说之路
csdn博客 http://blog.csdn.net/u012175089/article/list/2

浙公网安备 33010602011771号