鱼C论坛

 找回密码
 立即注册
查看: 2634|回复: 2

[已解决]给两个数据类型不同的栈初始化

[复制链接]
发表于 2022-4-3 01:36:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
比如我想建立两个栈,一个存放符号一个存放数据。
  1. typedef struct
  2. {
  3.         double *base;
  4.         double *top;
  5.         int stackSize;
  6. }sqStackN;//数栈

  7. typedef struct
  8. {
  9.         char *base;
  10.         char *top;
  11.         int stackSize;
  12. }sqStackC;//符号栈
复制代码


我该怎样写一个子函数,既可以初始化数栈又能初始化符号栈?
同理,怎样写压栈弹栈子函数也既可以操作数栈又可以操作符号栈?
最佳答案
2022-4-3 22:35:34
你不应该写一个栈的初始化函数来初始化两个不同用途的结构体
你应该写一个通用的栈,让这个栈可以保存任意的数据
像下面这样的

stack.h
  1. #ifndef _STACK_H_
  2. #define _STACK_H_

  3. #include <stddef.h>
  4. #include <stdbool.h>

  5. typedef struct stack_node_tag {
  6.     struct stack_node_tag *next;
  7.     void *data;
  8.     size_t size;
  9. } stack_node_t;

  10. typedef struct {
  11.     stack_node_t *head;
  12.     size_t size;
  13. } stack_t;

  14. stack_t *stack_init(void);
  15. void stack_deinit(stack_t *stack);
  16. void stack_clean(stack_t *stack);
  17. bool stack_push(stack_t *stack, const void *data, size_t size);
  18. bool stack_pop(stack_t *stack);
  19. bool stack_top(const stack_t *stack, void *data, size_t size);
  20. bool stack_empty(const stack_t *stack);
  21. size_t stack_size(const stack_t *stack);

  22. #endif
复制代码


stack.c
  1. #include "stack.h"
  2. #include <stdlib.h>
  3. #include <string.h>

  4. stack_t *stack_init(void) {
  5.     stack_t *stack = malloc(sizeof(*stack));
  6.     if(!stack) return NULL;
  7.     stack->head = NULL;
  8.     stack->size = 0;
  9.     return stack;
  10. }

  11. void stack_deinit(stack_t *stack) {
  12.     if(!stack) return;
  13.     stack_clean(stack);
  14.     free(stack);
  15. }

  16. void stack_clean(stack_t *stack) {
  17.     if(!stack) return;
  18.     while(!stack_empty(stack)) stack_pop(stack);
  19. }

  20. bool stack_push(stack_t *stack, const void *data, size_t size) {
  21.     if(!stack) return false;
  22.     if(!data) return false;
  23.     stack_node_t *node = malloc(sizeof(*node));
  24.     if(!node) return false;
  25.     node->data = malloc(size);
  26.     if(!node->data) {free(node); return false;}
  27.     memcpy(node->data, data, size);
  28.     node->size = size;
  29.     node->next = stack->head;
  30.     stack->head = node;
  31.     ++stack->size;
  32.     return true;
  33. }

  34. bool stack_pop(stack_t *stack) {
  35.     if(!stack) return false;
  36.     if(stack_empty(stack)) return false;
  37.     stack_node_t *temp = stack->head;
  38.     stack->head = temp->next;
  39.     free(temp->data);
  40.     free(temp);
  41.     --stack->size;
  42.     return true;
  43. }

  44. bool stack_top(const stack_t *stack, void *data, size_t size) {
  45.     if(!stack) return false;
  46.     if(!data) return false;
  47.     if(size < stack->head->size) return false;
  48.     memcpy(data, stack->head->data, stack->head->size);
  49.     return true;
  50. }

  51. bool stack_empty(const stack_t *stack) {
  52.     if(!stack) return true;
  53.     return stack->size == 0;
  54. }

  55. size_t stack_size(const stack_t *stack) {
  56.     if(!stack) return 0;
  57.     return stack->size;
  58. }
复制代码


main.c
  1. #include "stack.h"
  2. #include <stdio.h>
  3. #include <stdint.h>

  4. typedef struct {
  5.     long x, y;
  6. } point_t;

  7. typedef struct {
  8.     const char *name;
  9.     size_t age;
  10.     char sex;
  11.     const char *addr;
  12. } student_t;

  13. int main(void) {
  14.     stack_t *stack = stack_init();
  15.     {
  16.         int num = 1234;
  17.         stack_push(stack, &num, sizeof(num));
  18.         double pi = 3.14;
  19.         stack_push(stack, &pi, sizeof(pi));
  20.         point_t point = {1920, 1080};
  21.         stack_push(stack, &point, sizeof(point));
  22.         student_t student = {
  23.             "胡图图",
  24.             3,
  25.             'M',
  26.             "翻斗大街翻斗花园二号楼1001室(10楼)"
  27.         };
  28.         stack_push(stack, &student, sizeof(student));
  29.         char hello[] = "hello world!";
  30.         stack_push(stack, &hello, sizeof(hello));
  31.     }
  32.     {
  33.         char hello[13];
  34.         stack_top(stack, &hello, sizeof(hello));
  35.         stack_pop(stack);
  36.         puts(hello);
  37.         student_t student;
  38.         stack_top(stack, &student, sizeof(student));
  39.         stack_pop(stack);
  40.         printf("%s, %lu, %c, %s\n", student.name, student.age, student.sex, student.addr);
  41.         point_t point;
  42.         stack_top(stack, &point, sizeof(point));
  43.         stack_pop(stack);
  44.         printf("%ld, %ld\n", point.x, point.y);
  45.         double pi;
  46.         stack_top(stack, &pi, sizeof(pi));
  47.         stack_pop(stack);
  48.         printf("%lf\n", pi);
  49.         int num;
  50.         stack_top(stack, &num, sizeof(num));
  51.         stack_pop(stack);
  52.         printf("%d\n", num);
  53.     }
  54.     stack_deinit(stack);
  55.     {
  56.         stack_t *sa = stack_init();
  57.         stack_t *sb = stack_init();
  58.         for(char i = '0'; i <= '9'; ++i) {
  59.             stack_push(sa, &i, sizeof(i));
  60.         }
  61.         for(double i = 3.14; i <= 100; i += 10) {
  62.             stack_push(sb, &i, sizeof(i));
  63.         }
  64.         while(!stack_empty(sa)) {
  65.             char ch;
  66.             stack_top(sa, &ch, sizeof(ch));
  67.             stack_pop(sa);
  68.             printf("%c ", ch);
  69.         }
  70.         puts("");
  71.         while(!stack_empty(sb)) {
  72.             double d;
  73.             stack_top(sb, &d, sizeof(d));
  74.             stack_pop(sb);
  75.             printf("%lf ", d);
  76.         }
  77.         puts("");
  78.         stack_deinit(sb);
  79.         stack_deinit(sa);
  80.     }
  81.     return 0;
  82. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-3 12:33:12 | 显示全部楼层
你是想写个简单的计算机吧?这个其实不难,只是代码太长。
思路给你吧,看你想用单链表还是数组编写代码(因为看你的构造里面没有 next,但有 base 和 top,想说是不是头和尾?)
符号栈好象不需要数组或链表,只需存放一个字符便可,若有新符号入栈,则和原先字符比较优先级,然后将两个数栈里的数值直接做运算便可,将旧的符号替换便可。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-3 22:35:34 | 显示全部楼层    本楼为最佳答案   
你不应该写一个栈的初始化函数来初始化两个不同用途的结构体
你应该写一个通用的栈,让这个栈可以保存任意的数据
像下面这样的

stack.h
  1. #ifndef _STACK_H_
  2. #define _STACK_H_

  3. #include <stddef.h>
  4. #include <stdbool.h>

  5. typedef struct stack_node_tag {
  6.     struct stack_node_tag *next;
  7.     void *data;
  8.     size_t size;
  9. } stack_node_t;

  10. typedef struct {
  11.     stack_node_t *head;
  12.     size_t size;
  13. } stack_t;

  14. stack_t *stack_init(void);
  15. void stack_deinit(stack_t *stack);
  16. void stack_clean(stack_t *stack);
  17. bool stack_push(stack_t *stack, const void *data, size_t size);
  18. bool stack_pop(stack_t *stack);
  19. bool stack_top(const stack_t *stack, void *data, size_t size);
  20. bool stack_empty(const stack_t *stack);
  21. size_t stack_size(const stack_t *stack);

  22. #endif
复制代码


stack.c
  1. #include "stack.h"
  2. #include <stdlib.h>
  3. #include <string.h>

  4. stack_t *stack_init(void) {
  5.     stack_t *stack = malloc(sizeof(*stack));
  6.     if(!stack) return NULL;
  7.     stack->head = NULL;
  8.     stack->size = 0;
  9.     return stack;
  10. }

  11. void stack_deinit(stack_t *stack) {
  12.     if(!stack) return;
  13.     stack_clean(stack);
  14.     free(stack);
  15. }

  16. void stack_clean(stack_t *stack) {
  17.     if(!stack) return;
  18.     while(!stack_empty(stack)) stack_pop(stack);
  19. }

  20. bool stack_push(stack_t *stack, const void *data, size_t size) {
  21.     if(!stack) return false;
  22.     if(!data) return false;
  23.     stack_node_t *node = malloc(sizeof(*node));
  24.     if(!node) return false;
  25.     node->data = malloc(size);
  26.     if(!node->data) {free(node); return false;}
  27.     memcpy(node->data, data, size);
  28.     node->size = size;
  29.     node->next = stack->head;
  30.     stack->head = node;
  31.     ++stack->size;
  32.     return true;
  33. }

  34. bool stack_pop(stack_t *stack) {
  35.     if(!stack) return false;
  36.     if(stack_empty(stack)) return false;
  37.     stack_node_t *temp = stack->head;
  38.     stack->head = temp->next;
  39.     free(temp->data);
  40.     free(temp);
  41.     --stack->size;
  42.     return true;
  43. }

  44. bool stack_top(const stack_t *stack, void *data, size_t size) {
  45.     if(!stack) return false;
  46.     if(!data) return false;
  47.     if(size < stack->head->size) return false;
  48.     memcpy(data, stack->head->data, stack->head->size);
  49.     return true;
  50. }

  51. bool stack_empty(const stack_t *stack) {
  52.     if(!stack) return true;
  53.     return stack->size == 0;
  54. }

  55. size_t stack_size(const stack_t *stack) {
  56.     if(!stack) return 0;
  57.     return stack->size;
  58. }
复制代码


main.c
  1. #include "stack.h"
  2. #include <stdio.h>
  3. #include <stdint.h>

  4. typedef struct {
  5.     long x, y;
  6. } point_t;

  7. typedef struct {
  8.     const char *name;
  9.     size_t age;
  10.     char sex;
  11.     const char *addr;
  12. } student_t;

  13. int main(void) {
  14.     stack_t *stack = stack_init();
  15.     {
  16.         int num = 1234;
  17.         stack_push(stack, &num, sizeof(num));
  18.         double pi = 3.14;
  19.         stack_push(stack, &pi, sizeof(pi));
  20.         point_t point = {1920, 1080};
  21.         stack_push(stack, &point, sizeof(point));
  22.         student_t student = {
  23.             "胡图图",
  24.             3,
  25.             'M',
  26.             "翻斗大街翻斗花园二号楼1001室(10楼)"
  27.         };
  28.         stack_push(stack, &student, sizeof(student));
  29.         char hello[] = "hello world!";
  30.         stack_push(stack, &hello, sizeof(hello));
  31.     }
  32.     {
  33.         char hello[13];
  34.         stack_top(stack, &hello, sizeof(hello));
  35.         stack_pop(stack);
  36.         puts(hello);
  37.         student_t student;
  38.         stack_top(stack, &student, sizeof(student));
  39.         stack_pop(stack);
  40.         printf("%s, %lu, %c, %s\n", student.name, student.age, student.sex, student.addr);
  41.         point_t point;
  42.         stack_top(stack, &point, sizeof(point));
  43.         stack_pop(stack);
  44.         printf("%ld, %ld\n", point.x, point.y);
  45.         double pi;
  46.         stack_top(stack, &pi, sizeof(pi));
  47.         stack_pop(stack);
  48.         printf("%lf\n", pi);
  49.         int num;
  50.         stack_top(stack, &num, sizeof(num));
  51.         stack_pop(stack);
  52.         printf("%d\n", num);
  53.     }
  54.     stack_deinit(stack);
  55.     {
  56.         stack_t *sa = stack_init();
  57.         stack_t *sb = stack_init();
  58.         for(char i = '0'; i <= '9'; ++i) {
  59.             stack_push(sa, &i, sizeof(i));
  60.         }
  61.         for(double i = 3.14; i <= 100; i += 10) {
  62.             stack_push(sb, &i, sizeof(i));
  63.         }
  64.         while(!stack_empty(sa)) {
  65.             char ch;
  66.             stack_top(sa, &ch, sizeof(ch));
  67.             stack_pop(sa);
  68.             printf("%c ", ch);
  69.         }
  70.         puts("");
  71.         while(!stack_empty(sb)) {
  72.             double d;
  73.             stack_top(sb, &d, sizeof(d));
  74.             stack_pop(sb);
  75.             printf("%lf ", d);
  76.         }
  77.         puts("");
  78.         stack_deinit(sb);
  79.         stack_deinit(sa);
  80.     }
  81.     return 0;
  82. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 00:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表