• 数据结构:多栈共享技术


    一个程序中出现需要同时使用多个栈的情况,难以对栈空间的大小进行估计。

    初始化和定义

    1. #define MAX_SIZE 100
    2. typedef struct {
    3. int data[MAX_SIZE];
    4. int top1; // 第一个栈的栈顶指针//这里的int是栈的数据类型
    5. int top2; // 第二个栈的栈顶指针
    6. } SharedStack;
    7. // 初始化两栈共享技术的数据结构
    8. void initSharedStack(SharedStack *stack) {
    9. stack->top1 = -1; // 第一个栈的栈顶指针初始化为-1
    10. stack->top2 = MAX_SIZE; // 第二个栈的栈顶指针初始化为MAX_SIZE
    11. }

    进栈和出栈操作

    这一个为封装的明显简单了许多,其实还有一个没分开的就不写出来了

    1. #define MAX_SIZE 100
    2. typedef struct {
    3. int data[MAX_SIZE];
    4. int top1; // 第一个栈的栈顶指针
    5. int top2; // 第二个栈的栈顶指针
    6. } SharedStack;
    7. // 初始化两栈共享技术的数据结构
    8. void initSharedStack(SharedStack *stack) {
    9. stack->top1 = -1; // 第一个栈的栈顶指针初始化为-1
    10. stack->top2 = MAX_SIZE; // 第二个栈的栈顶指针初始化为MAX_SIZE
    11. }
    12. // 判断第一个栈是否为空
    13. int isEmpty1(SharedStack *stack) {
    14. return stack->top1 == -1;
    15. }
    16. // 判断第二个栈是否为空
    17. int isEmpty2(SharedStack *stack) {
    18. return stack->top2 == MAX_SIZE;
    19. }
    20. // 判断第一个栈是否已满
    21. int isFull1(SharedStack *stack) {
    22. return stack->top1 + 1 == stack->top2;
    23. }
    24. // 判断第二个栈是否已满
    25. int isFull2(SharedStack *stack) {
    26. return stack->top2 - 1 == stack->top1;
    27. }
    28. // 向第一个栈中压入元素
    29. void push1(SharedStack *stack, int value) {
    30. if (isFull1(stack)) {
    31. printf("Stack 1 is full.\n");
    32. return;
    33. }
    34. stack->data[++stack->top1] = value;
    35. }
    36. // 向第二个栈中压入元素
    37. void push2(SharedStack *stack, int value) {
    38. if (isFull2(stack)) {
    39. printf("Stack 2 is full.\n");
    40. return;
    41. }
    42. stack->data[--stack->top2] = value;
    43. }
    44. // 从第一个栈中弹出元素
    45. int pop1(SharedStack *stack) {
    46. if (isEmpty1(stack)) {
    47. printf("Stack 1 is empty.\n");
    48. return -1;
    49. }
    50. return stack->data[stack->top1--];
    51. }
    52. // 从第二个栈中弹出元素
    53. int pop2(SharedStack *stack) {
    54. if (isEmpty2(stack)) {
    55. printf("Stack 2 is empty.\n");
    56. return -1;
    57. }
    58. return stack->data[stack->top2++];
    59. }

    2.栈的空闲结点的申请和释放,和链表申请结点的方法是一样的,准确来说系统的分配空间就有点类似于栈

    1. #include
    2. using namespace std;
    3. struct Node {
    4. int data;
    5. Node* next;
    6. };
    7. Node* freeNodePool = NULL; // 空闲结点池
    8. // 申请一个新结点
    9. Node* allocateNode() {
    10. if (freeNodePool == NULL) {
    11. cout << "无法申请新结点,空闲结点池为空" << endl;
    12. return NULL;
    13. }
    14. Node* newNode = freeNodePool;
    15. freeNodePool = freeNodePool->next;
    16. newNode->next = NULL;
    17. return newNode;
    18. }
    19. // 归还空闲结点
    20. bool deallocateNode(Node* node) {
    21. if (node == NULL) {
    22. cout << "无需归还空结点" << endl;
    23. return false;
    24. }
    25. node->data = 0;
    26. node->next = freeNodePool;
    27. freeNodePool = node;
    28. return true;
    29. }
    30. int main() {
    31. // 初始化空闲结点池
    32. Node* node1 = new Node();
    33. Node* node2 = new Node();
    34. Node* node3 = new Node();
    35. freeNodePool = node1;
    36. node1->next = node2;
    37. node2->next = node3;
    38. // 申请一个新结点
    39. Node* newNode = allocateNode();
    40. if (newNode != NULL) {
    41. cout << "申请到的新结点地址:" << newNode << endl;
    42. }
    43. // 归还空闲结点
    44. bool success = deallocateNode(newNode);
    45. if (success) {
    46. cout << "归还空闲结点成功" << endl;
    47. }
    48. return 0;
    49. }

  • 相关阅读:
    xargs使用技巧 —— 筑梦之路
    JVM篇---第七篇
    【每日渗透笔记】参数值对应的接口,注入点测试尝试
    错误解决:Process finished with exit code 132 (interrupted by signal 4: SIGILL)
    C语言每日一题(31)相交链表
    博纳影业明日上市:于冬陷入与江疏影绯闻 被曝斥资千万买珠宝
    LINUX安装nginx
    MeterSphere 之 Idea插件开发
    2023-09-14 C语言泛型选择编程
    Linux系统中安装Redis并设置开机
  • 原文地址:https://blog.csdn.net/m0_64076371/article/details/136359958