每日一刷——9.23——数据结构——栈与队列(2)

1.如何用顺序表实现栈?(续)

1)构造函数
2)新元素进栈函数
3)栈顶元素出栈,由x返回

上面的昨天已经写过了,没看的可以先看第一篇——栈与队列(1)


4)读取栈顶元素,由x返回

有时候我们把书放进箱子之后,又因为懒惰又因为勤奋,我们只想看一看最上面的那本书是什么,看了几眼之后,并不想把它取出来,所以这时候就用到了我们的第四个函数——只是单纯的读取栈顶元素,并不把他取出来:

bool getTop(T& x)

返回值与出栈顶元素一样,都是bool,你到底看没看这本书啊,看到了就是true,没看到就是false

参数一样是由x来承接,你看到的这本书,把它放到x变量当中去

(当然,我觉得你也可以把返回值变成 T ,这样直接把看到的结果用一个变量返回出去,写成 T getTop() ,但是这样没有bool getTop(T& x)严谨吧,毕竟别人有判断你到底看到了没有,用了一个bool值)

5)判断栈是否为空

判断栈是否为空,这个很简单也很好实现,看看你的箱子里边有书么?

这也是一个很好的可以作为循环结束条件<----依次输出栈里边的各个元素。

形式如下:

bool IsEmpty();   //判断栈是否为空

6)判断栈是否为满

同样,如果你一直放书,肯定会有一天是箱子放满的情况,所以需要有一个函数来判断究竟你有没有把箱子放满。

形式如下:

bool IsFull();   //判断栈是否为满

7)计算栈中的元素个数

放完书之后,肯定要知道现在放了多少本书去了,所以还需要一个计算栈中元素个数的函数

形式如下:

int getSize();

返回值:很简单,计算个数,肯定要返回一个int个数值来给你

参数:啥也没有,数一下书的本数并不需要你给这个函数什么

8)清空栈的内容

突然想用箱子装其他东西了咋办嘞,这时候就需要清空栈的内容函数:

形式如下:

void MakeEmpty();  //清空栈的内容

2.代码实现

1)栈的类实现:
//栈的类 
template <class T>
class Stack{
	public:                //好家伙,这里别忘记写public,不然函数就都是私有的了 
		Stack(int sz);     //构造函数 
		void Push(T& x);   //添加新元素 
		bool Pop(T& x);    //栈顶元素出栈 
		
		bool IsEmpty();   //判断栈是否为空 
		bool IsFull();   //判断栈是否为满
		int getSize();   //计算栈中元素的个数 
		bool getTop(T& x);   //读取栈顶元素 
        void MakeEmpty();    //清空栈中的内容
		
	private:
		T *elements;    //存放栈中元素的栈数组 
		int top;
		int maxSize; 
}; 
2)判断栈是否为空 实现:
template <class T>
//判断栈是否为空 
bool Stack::IsEmpty(){
	if(top==-1)
		return true;
	else
		return false;
} 

其实,还有一种更简便的写法,主要是为了减少代码量(用三目运算符:

template <class T>
//判断栈是否为空 
bool Stack::IsEmpty(){
	return (top==-1)?true:false;
} 
3)判断栈是否为满 实现

与栈是否为空同理:

template <class T>
//判断栈是否为满 
bool Stack::IsFull(){
	if(top==maxSize-1)
		return true;
	else
		return false;
} 
4)读取栈顶元素,由x返回
template <class T>
bool Stack::getTop(T& x){
	if(top==-1){
		return false;
	}
	else{
		x=elements[top];
		return true;
	}
}
5)计算栈中的元素个数
template <class T>
int Stack::getSize(){
	return top+1;
}
6)清空栈的内容
template <class T>
void Stack::MakeEmpty(){
	top==-1;    //清空栈的内容 
}

3.整体代码:

#include <iostream>
using namespace std;


//栈的类 
template <class T>
class Stack{
	public:                //好家伙,这里别忘记写public,不然函数就都是私有的了 
		Stack(int sz);     //构造函数 
		void Push(T& x);   //添加新元素 
		bool Pop(T& x);    //栈顶元素出栈 
		
		bool IsEmpty();   //判断栈是否为空 
		bool IsFull();   //判断栈是否为满
		int getSize();   //计算栈中元素的个数 
		bool getTop(T& x);   //读取栈顶元素 
		void MakeEmpty();
	private:
		T *elements;    //存放栈中元素的栈数组 
		int top;
		int maxSize; 
}; 

void Stack::MakeEmpty(){
	top==-1;    //清空栈的内容 
}

//判断栈是否为空 
bool Stack::IsEmpty(){
	if(top==-1)
		return true;
	else
		return false;
} 

//判断栈是否为空 
bool Stack::IsEmpty(){
	return (top==-1)?true:false;
} 



//判断栈是否为满 
bool Stack::IsFull(){
	if(top==maxSize-1)
		return true;
	else
		return false;
} 

template <class T>
bool Stack::getTop(T& x){
	if(top==-1){
		return false;
	}
	else{
		x=elements[top];
		return true;
	}
}


int Stack::getSize(){
	return top+1;
}

template <class T>
// 构造函数
Stack::Stack(int sz){
    elements=new T[maxSize];   //你的箱子 
	top=-1;                //买回来,一本书没放,指向最底层 
	maxSize=sz;            //最大容量是你自己买的箱子的大小 
}

template <class T>
void Stack::Push(T& x){
	//但是我们还需要考虑到如果箱子已经是满的了呢? 
	if(top==maxSize-1) 
		overflowProcess();  //溢出处理,明天再讲 
	top++; //先瞅中了那个位置,再把元素放进去 
	elements[top]=x;    
}

template <class T>
bool Stack::Pop(T& x){
	if(top==-1)
		return false;    //箱子已经空了 
	x=elements[top];      
	top--;               //先把箱子中那个元素取出来,书放到的位置才会下降 
	return true;
}

(今天的函数实现都挺简单的,明天把一些让这个栈更加完善,功能更安全的函数写一下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值