一、实验目的
1. 掌握栈的顺序表示和实现;
二、实验原理
1.栈是限定仅在表尾进行插入或删除的线性表,又称为先进后出的线性表。栈有两种存储表示,顺序表示(顺序栈)和链式表示(链栈)。栈的主要操作是进栈和出栈,对于顺序栈的进栈和出栈操作要注意判断栈满或栈空。
三、实验内容及步骤
(一)实验内容
1.编写一个程序实现顺序栈的各种基本运算。
(二)实验步骤
1. 初始化顺序栈
2. 插入元素
3. 删除栈顶元素
4. 取栈顶元素
5. 遍历顺序栈
6. 置空顺序栈
1. #include<iostream> 2. #include<fstream> 3. using namespace std; 4. 5. //顺序栈定义 6. #define OK 1 7. #define ERROR 0 8. #define OVERFLOW -2 9. #define MAXSIZE 100//顺序栈存储空间的初始分配量 10. typedef int Status; 11. typedef char SElemType; 12. 13. typedef struct { 14. SElemType *base;//栈底指针 15. SElemType *top;//栈顶指针 16. int stacksize;//栈可用的最大容量 17. } SqStack; 18. 19. //算法3.1 顺序栈的初始化 20. Status InitStack(SqStack &S) { 21. S.base=new SElemType[MAXSIZE]; 22. if(!S.base) exit(OVERFLOW); 23. S.top=S.base; 24. S.stacksize=MAXSIZE; 25. return OK; 26. } 27. //算法3.2 顺序栈的入栈 28. Status Push(SqStack &S, SElemType e) { 29. if(S.top-S.base==S.stacksize)return ERROR; 30. *S.top++=e; 31. return OK; 32. } 33. //算法3.3 顺序栈的出栈 34. Status Pop(SqStack &S, SElemType &e) { 35. if(S.top==S.base) return ERROR; 36. e=*--S.top; 37. return OK; 38. } 39. //算法3.4 取顺序栈的栈顶元素 40. char GetTop(SqStack S) {//返回S的栈顶元素,不修改栈顶指针 41. if (S.top != S.base) //栈非空 42. return *(S.top - 1); //返回栈顶元素的值,栈顶指针不变 43. } 44. 45. int main() { 46. SqStack s; 47. int choose, flag = 0; 48. SElemType j, e, t; 49. cout << "1.初始化\n"; 50. cout << "2.入栈\n"; 51. cout << "3.读栈顶元素\n"; 52. cout << "4.出栈\n"; 53. cout << "0.退出\n\n"; 54. 55. choose = -1; 56. while (choose != 0) { 57. cout << "请选择:"; 58. cin >> choose; 59. switch (choose) { 60. case 1://算法3.1 顺序栈的初始化 61. if (InitStack(s)) { 62. flag = 1; 63. cout << "成功对栈进行初始化\n\n"; 64. } else 65. cout << "初始化栈失败\n\n"; 66. break; 67. case 2: {//算法3.2 顺序栈的入栈 68. fstream file; 69. file.open("SqStack.txt"); 70. if (!file) { 71. cout << "错误!未找到文件!\n\n" << endl; 72. exit(ERROR); 73. } 74. if (flag) { 75. flag = 1; 76. cout << "进栈元素依次为:\n"; 77. while (!file.eof()) { 78. file >> j; 79. if (file.fail()) 80. break; 81. else { 82. Push(s, j); 83. cout << j << " "; 84. } 85. } 86. cout << endl << endl; 87. } else 88. cout << "栈未建立,请重新选择\n\n"; 89. file.close(); 90. } 91. break; 92. case 3://算法3.3 顺序栈的出栈 93. if(flag != -1 && flag != 0) 94. cout << "栈顶元素为:\n" << GetTop(s) << endl << endl; 95. else 96. cout << "栈中无元素,请重新选择\n" << endl; 97. break; 98. case 4://算法3.4 取顺序栈的栈顶元素 99. cout << "依次弹出的栈顶元素为:\n"; 100. while (Pop(s, t)){ 101. flag = -1; 102. cout << t << " "; 103. } 104. cout << endl << endl; 105. break; 106. } 107. } 108. return 0; 109. }