数据结构-栈和队列 下载本文

1.栈

1.1 栈的定义

栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。如下所示:

结论:后进先出(Last In First Out),简称为LIFO线性表。

栈的基本运算有六种: 构造空栈:InitStack(S)、 判栈空: StackEmpty(S)、 判栈满: StackFull(S)、

进栈: Push(S,x)、可形象地理解为压入,这时栈中会多一个元素 退栈: Pop(S) 、 可形象地理解为弹出,弹出后栈中就无此元素了。 取栈顶元素:StackTop(S),不同与弹出,只是使用栈顶元素的值,该元素仍在栈顶不会改变。

由于栈也是线性表,因此线性表的存储结构对栈也适用,通常栈有顺序栈和链栈两种存储结构,这两种存储结构的不同,则使得实现栈的基本运算的算法也有所不同。

我们要了解的是,在顺序栈中有\上溢\和\下溢\的概念。顺序栈好比一个盒子,我们在里头放了一叠书,当我们要用书的话只能从第一本开始拿(你会把盒子翻过来吗?真聪明^^),那么当我们把书本放到这个栈中超过盒子的顶部时就放不下了(叠上去的不算,哼哼),这时就是\上溢\上溢\也就是栈顶指针指出栈的外面,显然是出错了。反之,当栈中已没有书时,我们再去拿,看看没书,把盒子拎起来看看盒底,还是没有,这就是\下溢\。\下溢\本身可以表示栈为空栈,因此可以用它来作为控制转移的条件。

链栈则没有上溢的限制,它就象是一条一头固定的链子,可以在活动的一头自由地增加链环(结点)而不会溢出,链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要在头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。

1.2 栈的顺序存储

使用c++的面向对象封装:

1. // Test.cpp : Defines the entry point for the console applicati

on. 2. //

3. #include \4. #include 5. using namespace std;

6. #define MAX 10 // MAXIMUM STACK CONTENT 7. class stack 8. {

9. private:

10. int arr[MAX]; 11. int top; 12.public: 13. stack() 14. {

15. inItStack(); 16. }

17. /************************************************************************/

18. /* 初始化

栈 */

19. /************************************************************************/

20. void inItStack() 21. {

22. top=-1; 23. }

24. /************************************************************************/ 25. /* 入

栈 */

26. /************************************************************************/

27. void push(int a) 28. {

29. top++;

30. if(top < MAX) { 31. arr[top]=a; 32. } else {

33. cout<<\34. } 35. }

36. /************************************************************************/ 37. /* 出

栈 */

38. /************************************************************************/ 39. int pop() 40. {

41. if(isEmpty()) {

42. cout<<\43. return NULL; 44. } else {

45. int data=arr[top]; 46. arr[top]=NULL; 47. top--;

48. return data; 49. } 50. }