栈是先进先出的一种数据结构。本文是以静态数组为存储结构的栈的实现。
栈的ADT如下:
{
数据元素集合:一个元素的有序序列,只能在栈顶进行入栈和出栈的操作;
基本方法:
1.stack ():创建一个空栈;
2.empty ():检查栈是否为空;
3.push ():在栈顶添加一个元素;
4.top () :提取栈顶元素;
5.pop () :删除栈顶元素;
};
基本操作算法描述如下:
1.构造函数:
编译器将为数据成员myArray[] 和 Top分配内存,这样stack 的构造函数只需要执行创建一个空栈所需要的初始化工作;因为Top是指向栈顶的,所以很自然地通过将Top赋值为-1就可标志一个空栈;
2.判空函数:
由于Top是指向栈顶的,所有判断栈是否为空只需判断Top是否为-1即可;
3.入栈函数:
如果myArray[]还没有满 (即Top < max)
(1)将Top加一;
(2)将值存储到myArray[Top]
否则
处理入栈失败操作
4.提取栈顶元素函数:
如果栈为非空,返回myArray[Top]中的值;否则指示栈空;
5.删除栈顶元素函数:
如果栈非空,Top减一;否则指示栈空;
具体代码:
#include <iostream>
//#include "Stack.h"
using namespace std;
#define max 10 //栈的最大容量
typedef int StackElement;
//栈的类声明部分
class stack
{
public :
stack ();
bool empty () const;
void push (const StackElement & item);
StackElement top () const;
void pop ();
void display (ostream & out) const;
private :
StackElement myArray[max];
int Top;
};
//栈的实现部分
stack::stack () : Top (-1) {} //
bool stack::empty () const
{
return Top == -1;
}
void stack::push (const StackElement & item)
{
if (Top < max-1)
{ Top++;
myArray[Top] = item;
}
else
cerr << "Push Error\n";
}
void stack::display (ostream & out) const
{
for (int i=Top; i>=0; i--)
out << myArray[i] <<endl;
}
StackElement stack::top () const
{
if (Top==-1)
cerr << "Top Error\n";
else
return myArray[Top];
}
void stack::pop ()
{
if (Top!=-1)
Top--;
else
cerr << "pop Error\n";
}
//栈类测试部分
int main ()
{
stack s;
cout << "stack created.Empty ?\n" << (s.empty ()?"YES":"NO") << endl;
cout << "How Many item to enter the stack?\n";
int num;
cin >> num;
for (int i=1;i<=num;i++)
{
cout << "push " << i << " to the stack!\n";
s.push (i);
}
cout << "stack contents: \n";
s.display (cout);
cout << "stack empty ? " << s.empty () << endl;
cout << "Top item : " << s.top() << endl;
while (!s.empty ())
{
cout << "Poping " << s.top () << endl;
s.pop ();
}
cout << "stack empty ?\n" << s.empty () << endl;
cout << "Top value " << s.top () << endl;
return 0;
}