:::info 存储形式以及操作和顺序表和链表差不多,需要的操作也少,学栈和队列,感觉只是抽离出来这两种便于在应用层面使用 :::

顺序栈

  1. #include<bits/stdc++.h>
  2. typedef int Status;
  3. typedef int SElemType;
  4. #define OVERFLOW -1
  5. #define ERROR 0
  6. #define OK 1
  7. #define MAXSIZE 100
  8. using namespace std;
  9. /**
  10. * 顺序栈
  11. *
  12. * 顺序栈的基本操作:初始化、入栈、出栈、取栈顶元素
  13. */
  14. /* 顺序栈的存储形式 */
  15. typedef struct {
  16. SElemType *base;
  17. SElemType *top;
  18. int stacksize;
  19. } SqStack;
  20. /* 初始化 */
  21. Status InitSqStack(SqStack &stack) {
  22. // 为栈分配容量
  23. stack.base = new int[MAXSIZE];
  24. // 分配失败返回失败值
  25. if (!stack.base) {
  26. return OVERFLOW;
  27. }
  28. // 让栈顶地址初始为栈底地址
  29. stack.top = stack.base;
  30. // 初始化容量
  31. stack.stacksize = MAXSIZE;
  32. return OK;
  33. }
  34. /* 入栈 */
  35. Status Push(SqStack &stack, SElemType e) {
  36. if (stack.top - stack.base == stack.stacksize) {
  37. return OVERFLOW;
  38. }
  39. *stack.top = e; // 先在top位置赋值
  40. stack.top++; // 将top地址++
  41. return OK;
  42. }
  43. /* 出栈 */
  44. Status Pop(SqStack &stack) {
  45. // 空栈返回异常
  46. if (stack.top == stack.base) {
  47. return OVERFLOW;
  48. }
  49. stack.top--; // 栈顶地址减1
  50. return *stack.top; // 返回此时“栈顶”元素
  51. }
  52. /* 取栈顶元素 */
  53. Status GetTop (SqStack &stack) {
  54. // 空栈返回异常
  55. if (stack.top == stack.base) {
  56. return OVERFLOW;
  57. }
  58. // stack.top--; // 栈顶地址减1,这是和出栈的区别
  59. return *(stack.top-1); // 返回此时“栈顶”元素
  60. }
  61. int main() {
  62. SqStack test;
  63. InitSqStack(test);
  64. Push(test, 10);
  65. Push(test, 15);
  66. Push(test, 20);
  67. cout << GetTop(test)<<" "<< GetTop(test)<<" "<< GetTop(test)<<" "<<"\n";
  68. cout << Pop(test)<<" "<< Pop(test)<<" "<< Pop(test)<<" "<<"\n";
  69. }

链栈

  1. #include<bits/stdc++.h>
  2. typedef int Status;
  3. typedef int SElemType;
  4. #define OVERFLOW -1
  5. #define ERROR 0
  6. #define OK 1
  7. #define MAXSIZE 100
  8. using namespace std;
  9. /**
  10. * 链栈
  11. *
  12. * 链栈的基本操作:初始化、入栈、出栈、取栈顶元素
  13. */
  14. /* 链栈的存储形式 */
  15. typedef struct StackNode{
  16. SElemType data;
  17. struct StackNode *next;
  18. } StackNode, *LinkStack;
  19. /**
  20. * 初始化
  21. * 不设头结点
  22. */
  23. Status InitLinkStack(LinkStack &stack) {
  24. stack = NULL; // 栈顶元素置空
  25. return OK;
  26. }
  27. /* 入栈 */
  28. Status Push(LinkStack &stack, SElemType e) {
  29. // 不能用LinkStack这样声明结点变量,需要new一个内存空间
  30. LinkStack temp = new StackNode;
  31. temp->data = e;
  32. temp->next = stack;
  33. stack = temp;
  34. return OK;
  35. }
  36. /* 出栈 */
  37. Status Pop (LinkStack &stack) {
  38. SElemType i = stack->data;
  39. stack = stack->next;
  40. return i;
  41. }
  42. /* 取栈顶元素 */
  43. Status GetTop (LinkStack &stack) {
  44. return stack->data;
  45. }
  46. int main() {
  47. LinkStack test;
  48. InitLinkStack(test);
  49. Push(test, 10);
  50. Push(test, 15);
  51. Push(test, 20);
  52. cout << GetTop(test)<<" "<< GetTop(test)<<" "<< GetTop(test)<<" "<<"\n";
  53. cout << Pop(test)<<" "<< Pop(test)<<" "<< Pop(test)<<" "<<"\n";
  54. }