习题2.编写一个类,实现简单的栈
2.编写一个类,实现简单的栈。栈中有以下操作:
> 元素入栈 void push(int);
> 元素出栈 void pop();
> 读出栈顶元素 int top();
> 判断栈空 bool emty();
> 判断栈满 bool full();
如果栈溢出,程序终止。栈的数据成员由存放
10个整型数据的数组构成。先后做如下操作:
> 创建栈
> 将10入栈
> 将12入栈
> 将14入栈
> 读出并输出栈顶元素
> 出栈
> 读出并输出栈顶元素
解题思路:
栈:先进后出。
- 需要数组
*_data
存储数据。_size
表示栈的总体大小。 - 数组的下标
_top
每次记录当前位置(栈顶指针的下标)。 - 当数组内没有数据时,
_top
为-1。 - 出栈时,直接把
_top
减一,不用关心那个位置的数据,下次压栈会把数据覆盖 - 压栈时,把栈顶
_top
加一,然后把要压栈的数据赋值给当前数组的位置。
数据成员需要:
栈顶指针的下标 int _top;
栈的总大小 int _size;
栈中元素 int *_data; (数组)
条件:
栈为空 -1 == _top
栈满 _top == _size
操作:
入栈 _data[++_top] = value;
出栈 --top;
获取堆顶元素 _data[_top]
#include <iostream>
using std::cout;
using std::endl;
class Stack
{
public:
//构造函数,默认栈大小为10,可输入数据进行改变;
Stack(int size = 10)
:_top(-1)
,_size(size)
,_data(new int[size]())
{
cout << "Stack()" << endl;
}
//判断栈是否为空
bool empty()
{
return _top == -1;
}
//判断栈是否为满
bool full()
{
return (_top == _size - 1);
}
//压栈
void push(const int &value)
{
if(!full())
{
_data[++_top] = value;
}
else
{
cout << "Stack is full, cannot add any data!" << endl;
}
}
//出栈
void pop()
{
if(!empty())
{
_top--;
}
else
{
cout << "Stack is empty, cannot pop any data!" << endl;
}
}
//获得栈顶元素
int gettop()
{
if(empty())
{
cout << "Stack is empty!" << endl;
}
return _data[_top];
}
//析构函数
~Stack()
{
cout << "~Stack()" << endl;
if(_data)
{
delete []_data;
_data = nullptr;
}
}
private:
int _top;
int _size;
int *_data;
};
int main()
{
Stack s1;
cout << "栈是否为空:" ;
cout << s1.empty() << endl;
cout << "栈是否为满:" ;
cout << s1.full() << endl;
s1.push(10);
s1.push(12);
s1.push(14);
int temp = s1.gettop();
cout << "当前栈顶元素为:" << temp << endl;
s1.pop();
temp = s1.gettop();
cout << "当前栈顶元素为:" << temp << endl;
return 0;
}