数据结构之栈(一):栈的实现

来源:互联网 发布:如何学习大数据 编辑:程序博客网 时间:2024/06/11 21:38

从数据结构的角度来看,栈也是一种线性表,不过是操作受限的线性表。它必须按后进先出(Last In First, LIFO)的规则进行操作。

栈只能在一端进行插入删除,删除的一端称为栈顶,另一端称为栈底。当元素中没有元素时称为空栈。栈的插入常称为入栈,删除常称为出栈出栈入栈的元素只能是栈顶元素。生活中后进先出的例子很多,例如:一叠堆在一起的盘子,从中取一只或放入一只,从顶部比较方便。程序设计中栈的应用也比较普遍,如编译程序中判断表达式的括号匹配、算术表达式求值等问题。


利用顺序存储方式实现的栈又称作顺序栈,类似顺序表的定义,栈中的数据元素用一个预设足够长度的一维数组来存储。栈底位置可以设置在数组的任意一个端点,为了方便,我们将栈底位置设在下标0处。由于栈顶位置会随着出栈入栈而变化,因此可用一个整型变量来表示当前栈顶的位置,通常称该整型变量为栈底指针。


下面给出顺序栈(顺序存储,数组)类模板的C++实现:

emplate<class T,int MaxSize>class SeqStack{T data[MaxSize];//存放元素的数组int top;//栈顶指针,指示栈顶元素在数组中的下标public:SeqStack();void Push(T x);//入栈T Pop();//出栈T Top();//取栈顶元素(不出栈)bool Empty();//判断栈是否为空};template<class T, int MaxSize>SeqStack<T, MaxSize>::SeqStack()//初始化{top = -1;}template<class T, int MaxSize>void SeqStack<T, MaxSize>::Push(T x){if (top==MaxSize-1)//这时栈已经满了。无法再压入新的元素{cerr << "上溢";exit(1);}top++;//指针移动data[top] = x;//赋值}template<class T, int MaxSize>T SeqStack<T, MaxSize>::Pop(){if (top==-1)//根据栈顶指针判断是否为空{cerr << "下溢";exit(1);}return data[top--];//返回栈顶指针,并且top移动}template<class T, int MaxSize>T SeqStack<T, MaxSize>::Top(){if (top == -1){cerr << "下溢";exit(1);}return data[top];}template<class T, int MaxSize>bool SeqStack<T, MaxSize>::Empty(){return top == -1;//如果top=-1,说明栈为空}


已经理解的同学可以去尝试下链栈,链栈相当于单链表操作的简化。比较简单。



0 0
原创粉丝点击