栈作为一种数据结构,它按照后进先出的原则存储数据,只能在栈顶进行插入和删除操作的特殊线性表。
按照存储方式不同,栈可以分为顺序栈和链式栈。
实现顺序栈需要注意:
(1)采用顺序存储方式;
(2)需要预分配空间,data[maxlen];
(3)合理分配内存空间是个比较麻烦的事情。如果每个栈分配空间多,则会造成存储空间浪费;如果分配空间少,则会出现“溢出”。(这个问题可以通过链式栈来解决)
以下为具体实现代码,在vs2010上测试通过:
#include <iostream>
using namespace std;
#define maxlen 30
class myStack
{
public:
myStack();
bool empty();
bool full();
bool getTopElement(int &x);
bool push(int x);
bool pop();
int size();
private:
int count;
int data[maxlen];
};
int _tmain(int argc, _TCHAR* argv[])
{
myStack sta;
bool flag = sta.empty();//判断栈是否为空
if(flag)
{
for(int i = 0; i < 5; i++)
sta.push(i);//入栈
}
int x;
sta.getTopElement(x);//x = 4, 访问栈顶元素
sta.pop();//栈顶元素出栈
sta.getTopElement(x);//x = 3, 访问栈顶元素
return 0;
}
myStack::myStack()//初始化
{
count = 0;
}
bool myStack::empty()
{
if(count == 0)
return true;
else
return false;
}
bool myStack::full()
{
if(count == maxlen)
return true;
else
return false;
}
//当栈中有一个元素时,count = 1, 存放在data[0]
bool myStack::getTopElement(int &x)
{
if(empty())
return false;
else
{
x = data[count - 1];//访问栈顶元素与元素出栈要区分
return true;
}
}
bool myStack::push(int x)
{
if(full())
return OVERFLOW;
else
{
data[count++] = x;//同时执行了count = count + 1;
return true;
}
}
bool myStack::pop()
{
if(empty())
return UNDERFLOW;
else
{
count--;
return true;
}
}
int myStack::size()
{
return count;
}