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;
}
(今天的函数实现都挺简单的,明天把一些让这个栈更加完善,功能更安全的函数写一下)