52.png

    1. /*
    2. 设有两个栈s1、s2都采用顺序栈方式,并共享一个存储区,大小为max,为了尽量利用空间,减少溢出的可能,
    3. 可采用栈顶相向、迎面增长的存储方式,试设计s1、s2有关入栈和出栈的算法。
    4. 分析:
    5. */
    6. #include<stdio.h>
    7. #include<stdbool.h>
    8. #include<stdlib.h>
    9. #define TYPE char
    10. struct Stack
    11. {
    12. TYPE* arr; //内存首地址
    13. int top[2]; //栈的下标
    14. };
    15. /* --------------以下为实现函数--------------------*/
    16. //创建一个栈
    17. Stack *createStack(int size) {
    18. struct Stack *stack = (struct Stack*)malloc(sizeof(struct Stack));//给栈分配空间
    19. stack->arr = (TYPE *)malloc(sizeof(TYPE)*size);//给内存首地址分配空间,大小用户指定
    20. stack->top[0] = -1;//栈顶下标,当前无元素,故为-1
    21. stack->top[1] = size;//栈顶下标,当前无元素,故为-1
    22. return stack;
    23. }
    24. //判断栈满
    25. bool full(Stack *stack) {
    26. return stack->top[1]-stack->top[0] == 1;
    27. }
    28. //判断栈空
    29. bool empty(int i,Stack *stack,int size) {
    30. switch (i) {
    31. case 0:
    32. return stack->top[0] == -1;
    33. case 1:
    34. return stack->top[0] == size;
    35. }
    36. }
    37. //入栈(具体值)
    38. bool push(Stack *stack, TYPE data,int i) {
    39. if (full(stack)) return false;
    40. switch (i) {
    41. case 0:
    42. *(stack->arr + ++stack->top[i]) = data;
    43. case 1:
    44. *(stack->arr + --stack->top[i]) = data;
    45. }
    46. return true;
    47. }
    48. //出栈
    49. bool pop(int i,Stack *stack,int size) {
    50. if (empty(i,stack,size)) return false;
    51. switch (i) {
    52. case 0:
    53. stack->top[i]--;
    54. case 1:
    55. stack->top[i]++;
    56. }
    57. return true;
    58. }