数据结构学习笔记1——栈

参考文章:

《顺序栈之C++实现》
《C++实现顺序栈的基本功能》


1,基本定义

栈(stack)是只能在最后一个位置上进行插入和删除操作的表,该位置是表的末端(vector的back),栈的顶(top)。
栈又称为LIFO(Last In First Out)表,最典型的特征就是先进后出,后进先出。
栈就好比是一个装东西的木桶,先放进去的东西在桶底,后放进去的东西在顶部,所以取东西的时候,总是先取顶部的,也就是后放进去的东西。
数据结构学习笔记1——栈_第1张图片
栈可以用单向链表来实现,也可以用数组或顺序容器来实现,用数组或顺序容器来实现的栈就被称为顺序栈。

2,代码实现

接下来将分别用数组、vector容器和模板三种方式来实现顺序Stack。
用数组实现时,必须指定stack中存储的数据类型和stack中能存储的最大数据个数,在例子中将其分别定为int和100;
用vector容器实现时,不用再指定最大数据的个数,但是还是必须指定数据类型;
使用模板(配合vector容器)实现时,既不用指定数据大小,也不用指定数据类型;

p.s.强烈鄙视《数据结构与算法分析C++描述》一书!好歹你也是经典教材,居然说因为stack的实现太简单了,所以你就懒得给出代码了。。。坑死我们这些小白了……
代码文件的构架如下:
数据结构学习笔记1——栈_第2张图片
SeqStack.h和SeqStack.cpp用于实现数组版本的顺序栈;
SeqStack_Vector.h和SeqStack_Vector.cpp用于实现vector容器版本的顺序栈;
SeqStack_VT.h和SeqStack_VT_Def.h用于实现模板版本的顺序栈。
main.cpp中是主函数,测试栈的实现是否可用
Public.h中放的是公用的、常用的头文件,代码不贴出来。

2.1  数组版本

SeqStack.h:
/********************************************************/
// 用数组实现顺序栈(Sequence Stack)的数据定义
// 非模板版本,只存储int类型
/********************************************************/
#pragma once
#include "Public.h"

typedef int dataType;
const size_t MaxSizeStack = 100;//Stack数据的最大长度

//定义顺序栈类,数据用数组存储
class Stack
{
public:
	Stack();                    //默认构造函数
	void push(dataType elem);   //压入新成员,放在栈顶
	void pop();                 //删除栈顶成员
	dataType top();             //返回栈顶成员
	void clear();               //清空栈
	bool isEmpty();             //判断栈是否为空
	bool isFull();              //判断栈是否已满
	void print(ostream& out);
private:
	dataType data[MaxSizeStack];//用于存储数据的数组
	int      top_index;	    //栈顶所在的数组下标		
};

SeqStack.cpp:实现成员函数的定义
/********************************************************/
// 实现顺序栈(Sequence Stack)类Stack的成员函数定义
// 非模板版本,只存储int类型
/********************************************************/
#include "SeqStack.h"

//默认构造函数
Stack::Stack():top_index(-1)
{
	//若对象定义在局部作用域中,则不会对类中的数组成员做自动初始化
	//不手动清零其实也可以,因为能取什么值,由top_index决定
	memset(data, 0, MaxSizeStack * sizeof(dataType));
}

//压入数据
void Stack::push(dataType elem)
{
	//赋值完成后,top_index也自动+1
	data[++top_index] = elem;
}

//弹出数据
void Stack::pop()
{
	--top_index;
}

//获取栈顶成员
dataType Stack::top()
{
	if (top_index > -1)
	{
		return data[top_index];
	}
	else
	{
		//错误应该如何处理??
		return data[-1];
		cout << "访问空栈的成员" << endl;
	}
}

//清空栈
void Stack::clear()
{
	top_index = -1;
}

//判断栈是否为空
bool Stack::isEmpty()
{
	if (top_index >= 0)
	{
		return false;
	}
	else
	{
		return true;
	}
}

//判断栈是否已满
bool Stack::isFull()
{
	return top_index == MaxSizeStack - 1;
}

//打印所有栈成员
void Stack::print(ostream& out)
{
	if (isEmpty())
	{
		out << "The Stack is empty!" << endl;
	}
	else
	{
		for (size_t index = 0; index != top_index+1; index++)
		{
			out << data[index] << endl;
		}
	}	
}


2.2 vector容器版本

SeqStack_Vector.h
/********************************************************/
// 用vector实现顺序栈(Sequence Stack)的数据定义
// 可以不用限制数据的最大个数
/********************************************************/
#pragma once
#include "Public.h"

typedef int dataType;

//定义顺序栈类,数据用vector存储
class Stack_Vector
{
public:
	Stack_Vector() :top_index(-1) {}    //默认构造函数
	void push(dataType elem);	    //压入新成员,放在栈顶
	void pop();			    //删除栈顶成员
	dataType top();			    //返回栈顶成员
	void clear();			    //清空栈
	bool isEmpty();			    //判断栈是否为空
	void print(ostream& out);
private:
	vector data;		    //用于存储数据的数组
	int      top_index;		    //栈顶所在的数组下标		
};

SeqStack_Vector.cpp
/********************************************************/
// 用Vector实现顺序栈(Sequence Stac)类Stack_Vector的成员函数定义
// 非模板版本,只存储int类型
/********************************************************/
#include "SeqStack_Vector.h"

//压入数据
void Stack_Vector::push(dataType elem)
{	
	// vector的back就是栈的top
	data.push_back(elem);
	top_index++;
}

//弹出数据
void Stack_Vector::pop()
{
	if (!isEmpty())
	{
		data.pop_back();
		top_index--;
	}
}

//获取栈顶成员
dataType Stack_Vector::top()
{
	if (!isEmpty())
	{
		return data[top_index];
	}
	else
	{
		//错误应该如何处理??
		cout << "访问空栈的成员" << endl;
		return data[-1];
		
	}
}

//清空栈
void Stack_Vector::clear()
{
	top_index = -1;
}

//判断栈是否为空
bool Stack_Vector::isEmpty()
{
	if (top_index >= 0)
	{
		return false;
	}
	else
	{
		return true;
	}
}


//打印所有栈成员
void Stack_Vector::print(ostream& out)
{
	if (isEmpty())
	{
		out << "The stack is empty!" << endl;
	}
	else
	{
		for (size_t index = 0; index != top_index + 1; index++)
		{
			out << data[index] << endl;
		}
	}
}


2.3 模板版本

SeqStack_VT.h:模板的定义体
/********************************************************/
// 用vector和模板实现顺序栈(Sequence Stack)的数据定义
// 可以不用限制数据的最大个数和数据类型
/********************************************************/
#pragma once
#include "Public.h"

//定义顺序栈类,数据用vector存储,VT is short for Vector_Template
template
class Stack_VT
{
public:
	Stack_VT() :top_index(-1) {}        //默认构造函数
	void push(dataType const& elem);    //压入新成员,放在栈顶
	void pop();			    //删除栈顶成员
	dataType top();			    //返回栈顶成员
	void clear();			    //清空栈
	bool isEmpty();			    //判断栈是否为空
	void print(ostream& out);	    //打印所有栈成员
private:
	vector data;		    //用于存储数据的数组
	int      top_index;		    //栈顶所在的数组下标		
};

SeqStack_VT_Def.h:模板的函数成员的定义体
/********************************************************/
// 用Vector和模板实现顺序栈(Sequence Stac)类Stack_VT的成员函数定义
// 模板版本,存储任意类型和任意长度数据
/********************************************************/
#include "SeqStack_VT.h"

//压入数据,输入参数使用const引用
template 
void Stack_VT::push(dataType const& elem)
{
	// vector的back就是栈的top
	data.push_back(elem);
	top_index++;
}

//弹出数据
template 
void Stack_VT::pop()
{
	if (!isEmpty())
	{
		data.pop_back();
		top_index--;
	}
}

//获取栈顶成员
template 
dataType Stack_VT::top()
{
	if (!isEmpty())
	{
		return data[top_index];
	}
	else
	{
		//错误应该如何处理??
		cout << "访问空栈的成员" << endl;
		return data[-1];		
	}
}

//清空栈
template 
void Stack_VT::clear()
{
	top_index = -1;
}

//判断栈是否为空
template 
bool Stack_VT::isEmpty()
{
	if (top_index >= 0)
	{
		return false;
	}
	else
	{
		return true;
	}
}


//打印所有栈成员
template 
void Stack_VT::print(ostream& out)
{
	if (isEmpty())
	{
		out << "The stack is empty!" << endl;
	}
	else
	{
		for (size_t index = 0; index != top_index + 1; index++)
		{
			out << data[index] << endl;
		}
	}
}



2.4 主函数

main.cpp
/********************************************************/
// 主函数
// 用于测试编写的各函数与数据结构
/********************************************************/
#include "SeqStack.h"
#include "SeqStack_Vector.h"
#include "SeqStack_VT_Def.h"
int main()
{
	// 1,3个版本的顺序栈
	//Stack stack_obj;      //使用数组实现的栈
	//Stack_Vector stack_obj; //使用Vector实现的栈
	Stack_VT stack_obj;

	cout << "空栈打印:" << endl;
	stack_obj.print(cout);

	for (int index = 1; index != 10; index++)
	{
		stack_obj.push(index);
	}
	cout << "\npush后打印:" << endl;
	stack_obj.print(cout);

	for (int index = 1; index != 5; index++)
	{
		stack_obj.pop();
	}
	cout << "\npop后打印:" << endl;
	stack_obj.print(cout);




	system("pause");
	return 0;
}


2.5 运行结果

三种实现的栈,其运行结果是一样的。
注意:只有数组实现的栈提供了isFull()方法,其他的实现版本没必要提供这一方法。
数据结构学习笔记1——栈_第3张图片

你可能感兴趣的:(学习笔记)