数据结构之坐标栈
栈的基本知识
我们学习了栈的基本知识,我们规定栈是一种操作受限的线性表,栈规定数据只能从一个端口进行插入和删除操作(也叫入栈和出栈)
我们平时所使用的栈中都是存储的单一元素,例如整形数据栈,浮点型数据栈等等,但在我们实际使用中,我们会遇到将一组数据存入栈的操作,如我们所讲的坐标栈,入栈元素为(2, 5),(3,7)这样的数据。这里就需要使用坐标栈
坐标栈所需准备
一个坐标类(Coor)
class Coor
{
public:
Coor();
Coor(int x, int y);
void SetX(int x);
void SetY(int y);
int GetX();
int GetY();
void printinfo();
Coor* operator=( Coor* a);
~Coor();
private:
int m_ix;
int m_iy;
};
其中私有成员为x, y坐标。
**printinfo()**为打印坐标的函数
Coor operator=( Coor a)**为运算符重载,重载=运算符。
**Coor(int x, int y)**为构造函数,用来初始化对象。
下来看重载运算符的实现
Coor* Coor::operator=( Coor * a)
{
this->SetX(a->GetX());
this->SetY(a->GetY());
return this;
}
这里函数在后面会使用到,在这里先不做赘述。
这样我们就得到了一个坐标类,类中存放的是坐标对象
栈(Stack)
const int Maxsize = 50;
class Stack
{
friend ostream &operator<< (ostream & os, Coor &s); //重载<< 运算符
public:
Stack();
bool empty(); //判栈空
bool full(); //判栈满函数
void enStack(Coor *coor); //入栈函数
void outStack(Coor *a); //出栈操作
void displayStack(); //输出栈中元素
~Stack();
private:
Coor *max;
int top; //栈顶指针
};
坐标栈中需要注意的是在私有成员中的
Coor *max成员,是一个对象数组
其余都是常见的判栈空/满函数,入/出栈函数,以及显示栈中元素和重载<< 运算符函数
需要注意的是,由于我们在成员中声明了一个对象数组,所以必须要在析构函数中将其释放掉。
下面是构造函数初始化
Stack::Stack()
{
max = new Coor[Maxsize];
int i;
for (i = 0; i < Maxsize; i++)
{
max[i].SetX(0); //数组初始化
max[i].SetY(0);
}
top = -1;
}
这里我们将栈顶指针top初始化为-1的原因是,当我们在进行入栈操作后,top++后总是指向当前元素。
在栈空时,top指针指向-1,栈满时,top指针指向数组最大值-1( Maxsize - 1)。
<<运算符重载
ostream &operator<<( ostream & os, Coor & s)
{
os << "(" << s.GetX() << "," << s.GetY() << ")";
return os;
}
这里对<<重载后就可以直接输出坐标的(x, y) 。将代码变得简洁。
入出栈
void Stack::enStack(Coor *coor)
{
cout << "进栈操作" << endl;
if (full())
cout << "此时栈已满,入栈非法!!!" << endl;
else
{
top++;
///*max[top].SetX(coor->GetX());
//max[top].SetY(coor->GetY());*/
//max[top] = coor; //使用重载进行进栈操作
max[top].operator=(coor); //重载的另一种调用
//cout << "(" << max[top].GetX() << "," << max[top].GetY() << ")" << endl;
cout << max[top] << endl; //使用重载进行输出
}
}
void Stack::outStack(Coor *a)
{
cout << "出栈操作" << endl;
if (empty())
cout << "此时栈空,出栈非法!!!" << endl;
else
{
//cout << "此时top为多少!" << top << endl;
///*a->SetX(max[top].GetX());
//a->SetY(max[top].GetY());*/
a->operator=(max[top]); //使用重载进行输出
//a = max[top];
//cout << max[top] << endl;
cout << max[top] << endl; //使用重载进行输出;
top--;
}
}
入栈时,将入栈的坐标传入函数,先判断此时栈已经满,若栈未满,先将栈顶指针+1,再将坐标存入对象数组中。最后将入栈元素输出。
出栈时,先判断此时栈是否为空,若栈为空,出栈失败。若非空,则将要出栈的元素传递给形参,再将栈顶元素输出,最后将栈顶指针-1。
主函数
int main()
{
Coor *inelement = new Coor(1, 2);
Coor *outelement = new Coor();
Stack *s = new Stack;
///*inelement->SetX(1);
//inelement->SetY(2);*/
///*s->enStack(6);
//s->enStack(1);
//s->enStack(3);
//s->enStack(5);*/
s->enStack(inelement);
inelement->SetX(3);
inelement->SetY(4);
s->enStack(inelement);
s->displayStack();
s->outStack(outelement);
inelement->SetX(5);
inelement->SetY(6);
s->enStack(inelement);
s->displayStack();
s->outStack(outelement);
s->displayStack();
delete inelement;
delete outelement;
inelement = NULL;
outelement = NULL;
system("pause");
return 0;
}
结果展示
附下载链接 https://download.csdn.net/download/qq_36711295/11963487