
说起队列和栈,链表+动态内存分配的方式,是比较常见的方式,最近项目下需要在dsp上面使用队列和栈两种数据结构,所有就使用链表+动态内存分配的方式实现了一下,但是调试的过程中发现运行的时候总是在动态内存分配的位置出bug,动态内存分配malloc总是分配失败,返回空指针,尝试修改cmd的配置后,也仍然没有解决问题。思来想去还是用数组的方式来实现队列和栈,结果性能出奇的稳定,所以本博客记录一下用数组实现队列和栈的代码。
参考链接:数据结构:栈和队列(Stack & Queue)【详解】-CSDN博客
参考链接:c语言底层数组的方式实现栈和队列_c语言树和队列的底层实现是什么-CSDN博客
目录
queue.h
- #ifndef USERPROGRAM_QUEUE_QUEUE_H_
- #define USERPROGRAM_QUEUE_QUEUE_H_
-
- #include
-
- #define QUEUE_MAX_SIZE 500
- /*--------------- 单个Uint16队列 ---------------*/
- typedef struct _queue{
- int size;
- int front;
- int rear;
- Uint16 data[QUEUE_MAX_SIZE];
- } queue;
-
- void queue_init(queue *q);
- int enqueue(queue *q, Uint16 value);
- int dequeue(queue *q, Uint16 *value);
- int is_queue_empty(queue *q);
-
- extern queue scib_rx_queue;
- extern queue scib_tx_queue;
-
- #endif /* USERPROGRAM_QUEUE_QUEUE_H_ */
queue.c
- #include
-
- queue scib_rx_queue;
- queue scib_tx_queue;
-
- void queue_init(queue *q){
- q->size = 0;
- q->front = 0;
- q->rear = -1;
- }
-
- int enqueue(queue *q, Uint16 value){
- if(q->size == QUEUE_MAX_SIZE){
- return 0;
- }
- q->rear++;
- q->data[q->rear] = value;
- q->size++;
- return 1;
-
- }
-
- int dequeue(queue *q, Uint16 *value){
- if(q->size == 0){
- return 0;
- }
- *value = q->data[q->front];
- q->front++;
- q->size--;
-
- // 初始化 如果是实时系统里面一直用队列,初始化非常的关键
- if(q->size==0){
- q->front = 0;
- q->rear = -1;
- }
-
- return 1;
- }
-
- int is_queue_empty(queue *q){
- return (q->size==0);
- }
此部分内容,用于支撑博客DSP_TMS320F28335_优秀的串口通信框架_28335串口发送多个数据-CSDN博客的小队列通信方法。具体怎么应用上述的“以数组为底层的队列”,也可以通过看这篇博客去感受。
stack.h
- #ifndef USERPROGRAM_STACK_STACK_H_
- #define USERPROGRAM_STACK_STACK_H_
-
- #include
-
-
- #define STACK_MAX_SIZE 500
-
- typedef struct _stack
- {
- float data[STACK_MAX_SIZE]; //数组建立顺序栈
- int top;//栈中元素个数
- }stack;
-
- extern stack input_compute_stack;
- extern stack output_compute_stack;
-
- void stack_init(stack* s);
- int is_stack_empty(stack* s);
- int enstack(stack* s, float value);
- int destack(stack* s, float * value);
- void clearstack(stack* s);
-
- float computeformula(stack *s, float* constant_value, float* ch_value, Uint16* compute_rule, int N, int * ret);
-
- #pragma CODE_SECTION(computeformula,"ramfuncs");
-
- #endif /* USERPROGRAM_STACK_STACK_H_ */
stack.c
- #include
-
- stack input_compute_stack;
- stack output_compute_stack;
-
- void stack_init(stack* s){
- s->top = 0;
- }
-
- int is_stack_empty(stack* s){
- return (s->top==0);
- }
-
- int enstack(stack* s, float value){
- if (s->top == STACK_MAX_SIZE)
- {
- return 0;
- }
- else
- {
- s->data[s->top] = value;
- s->top++;
- return 1;
- }
- }
-
- int destack(stack* s, float * value)
- {
- if (s->top == 0)
- {
- return 0;
- }
- else
- {
- s->top--;
- *value = s->data[s->top];
- return 1;
- }
- }
-
- void clearstack(stack* s){
- s->top = 0;
- }
下面备份一个栈的应用,用于后缀表达式,计算四则运算公式
- float computeformula(stack *s, float* constant_value, float* ch_value, Uint16* compute_rule, int N, int * ret){
- int i;
- float result = 0;
- float operator1 = 0;
- float operator2 = 0;
- int stack_pop_ret1 = 1;
- int stack_pop_ret2 = 1;
- int stack_push_ret = 1;
-
- for(i = 0; i < N; i++){
- switch (compute_rule[i]){
- case ADD:
- stack_pop_ret1 = destack(s, &operator1);
- stack_pop_ret2 = destack(s, &operator2);
- result = operator2 + operator1;
- stack_push_ret = enstack(s, result);
- if(stack_pop_ret1==0 || stack_pop_ret2==0 || stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case SUBSTRACT:
- stack_pop_ret1 = destack(s, &operator1);
- stack_pop_ret2 = destack(s, &operator2);
- result = operator2 - operator1;
- stack_push_ret = enstack(s, result);
- if(stack_pop_ret1==0 || stack_pop_ret2==0 || stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case MULTIPLY:
- stack_pop_ret1 = destack(s, &operator1);
- stack_pop_ret2 = destack(s, &operator2);
- result = operator2 * operator1;
- stack_push_ret = enstack(s, result);
- if(stack_pop_ret1==0 || stack_pop_ret2==0 || stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case DIVIDE:
- stack_pop_ret1 = destack(s, &operator1);
- stack_pop_ret2 = destack(s, &operator2);
- if(stack_pop_ret1==0 || stack_pop_ret2==0 || operator1 == 0){
- *ret = 0;
- clearstack(s);
- return 0;
- }else{
- result = operator2 / operator1;
- stack_push_ret = enstack(s, result);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- }
- break;
- case CH1_P:
- stack_push_ret = enstack(s, ch_value[0]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CH2_P:
- stack_push_ret = enstack(s, ch_value[1]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CH3_P:
- stack_push_ret = enstack(s, ch_value[2]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CH4_P:
- stack_push_ret = enstack(s, ch_value[3]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CH5_P:
- stack_push_ret = enstack(s, ch_value[4]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CH1_N:
- stack_push_ret = enstack(s, -ch_value[0]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CH2_N:
- stack_push_ret = enstack(s, -ch_value[1]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CH3_N:
- stack_push_ret = enstack(s, -ch_value[2]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CH4_N:
- stack_push_ret = enstack(s, -ch_value[3]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CH5_N:
- stack_push_ret = enstack(s, -ch_value[4]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CONSTANT1:
- stack_push_ret = enstack(s, constant_value[0]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CONSTANT2:
- stack_push_ret = enstack(s, constant_value[1]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CONSTANT3:
- stack_push_ret = enstack(s, constant_value[2]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CONSTANT4:
- stack_push_ret = enstack(s, constant_value[3]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- case CONSTANT5:
- stack_push_ret = enstack(s, constant_value[4]);
- if(stack_push_ret==0){
- *ret = 0;
- clearstack(s);
- return 0;
- }
- break;
- default:
- break;
- }
- }
-
- clearstack(s);
- *ret = 1;
- return result;
-
- }
-
最后愿我们共同进步! 感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。