C数据结构:栈和队列应用场景

计算器实例

main.c

#include <stdlib.h>
#include <stdio.h>
#include "sqstack.h"

void compute(sqstack* snum,datatype* data)
{
    datatype n1,n2,n;
    st_pop(snum,&n2);
    st_pop(snum,&n1);
    switch(*data)
    {
        case '+':
            n = n1 +n2;
            break;
        case '-':
            n = n1 - n2;
            break;
        case '*':
            n = n1 * n2;
            break;
        case '/':
            n = n1 / n2;
            break;
        default:
            exit(1);
            break;
    }
    st_push(snum,&n);


}
int get_pri(int op)
{
    switch(op)
    {
        case '(':
            return 0;
        case '+':
            return 1;
        case '-':
            return 1;
        case '*':
        case '/':
            return 2;

    }
}
void deal_bracket(sqstack*snum ,sqstack* sop)
{
    datatype old_op;
    st_top(sop,&old_op);
    while(old_op != '(')
    {
        st_pop(sop,&old_op);
        compute(snum,&old_op);
        st_top(sop,&old_op);
    }
    st_pop(sop,&old_op); //弹出左括号

}
void deal_op(sqstack*snum,sqstack*sop,int op)
{
    datatype old_op;

    if( (st_isempty(sop)==0) ||op =='('  )  
    {
        st_push(sop,&op);
        return ;
    }
    
    st_top(sop,&old_op);
    if(get_pri(op) > get_pri(old_op))
    {
        st_push(sop,&op);
        return;
    }
    while( get_pri(op) <= get_pri(old_op) )
    {
        st_pop(sop,&old_op);
        compute(snum,&old_op);
        if(st_isempty(sop)== 0)
            break;
        st_top(sop,&old_op);
    }
    st_push(sop,&op);
    
}
int main()
{
    datatype old_op;
    int i=0;
    int value =0;
    int flag = 0;
    char str[] = "(11+3)*2-5"; //23
    sqstack*snum,*sop;
    snum = st_create();
    sop = st_create();


    while(str[i] != '\0')
    {
        // printf("%c  \n",str[i]);
        // num
        if(str[i]> '0' && str[i]< '9' )
        {
            value = value*10 + (str[i]- '0') ;  //求差值,原来内容移位
            flag = 1;
        }
        else // op
        {
            if(flag == 1) //证明取过了数值
            {
                st_push(snum,&value);
                value = 0;
                flag = 0;
            }
            if(str[i]==')')
            {
                deal_bracket(snum,sop);
            }
            else // 可能是  ( + - * / 
            {
                deal_op(snum,sop,str[i]);
            }
        }

        i++;
    }
    
    if(flag) //最后一个元素
    {
        st_push(snum,&value);
    }
    st_travel(snum);
    printf("--------\n"); 
    while(!(st_isempty(sop)==0) )
    {
        st_pop(sop,&old_op);
        compute(snum,&old_op);
        if(st_isempty(sop)==0)
            break;
        st_top(sop,&old_op);
    }
    st_travel(snum);

    st_destroy(snum);
    st_destroy(sop);

    return 0;
}

sqstack.h

#ifndef SQSTACK_H
#define SQSTACK_H

#define MAXSIZE 32

typedef int datatype;

typedef struct node_st
{
    datatype data[MAXSIZE];
    int top;
}sqstack;


sqstack* st_create(void);

int st_isempty(sqstack*);

int st_push(sqstack*,datatype*);

int st_pop(sqstack*,datatype*);

int st_top(sqstack*,datatype*);

void st_travel(sqstack*);

int st_destroy(sqstack*);

#endif

sqstack.c

#include <stdlib.h>
#include <stdio.h>
#include "sqstack.h"

sqstack* st_create(void)
{
    sqstack*st;
    st = malloc(sizeof(*st));
    if(st == NULL)
        return NULL;
        
    st->top = -1;
    return st;
}
int st_isempty(sqstack*st)
{
    if(st->top == -1)
        return 0;
    return 1;
//    return (st->top == -1);
}
int st_push(sqstack*st,datatype* data)
{
    if(st->top == MAXSIZE-1 )
        return -1;
    st->data[++st->top] = *data;
    return 0;
}
int st_pop(sqstack*st,datatype*data)
{
    if(st_isempty(st)==0)
        return -1;
    *data = st->data[st->top--];
    return 0;
}
int st_top(sqstack*st,datatype*data)
{
    if(st_isempty(st )== 0)
        return -1;
    *data = st->data[st->top];
    return 0;
}
void st_travel(sqstack*st)
{
    if(st_isempty(st)== 0)
        return;
    for(int i=0;i<=st->top;i++)
    {
        printf("%d ",st->data[i]);
    }
    printf("\n");
}

int st_destroy(sqstack*st)
{
    free(st);
    st = NULL;
    return 0;
}

球钟算法

代码中包含的sqstack.h/sqstack.c和 queue.h/queue.c参考之前文章:C数据结构栈,C数据结构队列,采用的是顺序存储栈,顺序存储队列,如有疑问,可以给博主留言。

main.c

#include <stdlib.h>
#include <stdio.h>
#include "sqstack.h"
#include "queue.h"

#define BALL_SIZE 27
static int check(queue*qu)
{
    int i = (qu->head+1)%MAXSIZE;

    while(i != qu->tail )
    {
        if(qu->data[i] > qu->data[(i+1)%MAXSIZE ])
            return 0;
        i = (i+1)%MAXSIZE;
    }
    return 1;
}

int main()
{
    int t,time = 0;
    queue* qu;
    int value = 0;
    sqstack*st_min,*st_fivemin,*st_hour;
    qu = qu_create();
    
    st_min = st_create();
    st_fivemin = st_create();
    st_hour = st_create();

    for(int i=1;i<=BALL_SIZE;i++)
    {
        qu_enqueue(qu,&i);
    }
    qu_travel(qu);
    while(1)
    {
        qu_dequeue(qu,&t);
        time++;

        if(st_min->top != 3)
        {
            st_push(st_min,&t);
        }
        else
        {
            while(st_isempty(st_min)!=0)
            {
                st_pop(st_min,&value);
                qu_enqueue(qu,&value);
            }
            if(st_fivemin->top !=10)
            {
                st_push(st_fivemin,&t);
            }
            else
            {
                while(st_isempty(st_fivemin)!=0 )
                {
                    st_pop(st_fivemin,&value);
                    qu_enqueue(qu,&value);
                }
                if(st_hour->top != 10)
                {
                    st_push(st_hour,&t);
                }
                else
                {
                    while(st_isempty(st_hour) !=0 )
                    {
                        st_pop(st_hour,&value);
                        qu_enqueue(qu,&value);
                    }
                    qu_enqueue(qu,&t);
                    if(check(qu))
                        break;
                }


            }
        }
    }

    printf("time = %d \n",time);
    qu_destroy(qu);
    st_destroy(st_min);
    st_destroy(st_fivemin);
    st_destroy(st_hour);

    return 0;
}

补充

大家也可以把上面用到的stack.h/llist.h两个文件编译为动态库使用。注意:

gcc -shared -fpic -o libstack_s.so stack.c 

 gcc main.c -o all -lstack_s -lllist_s

库之间有依赖关系,前面的动态库依赖于后面的stack_s中用到了llist

相关推荐

  1. C数据结构队列应用场景

    2024-05-11 07:58:06       35 阅读
  2. [数据结构] 队列C++作业

    2024-05-11 07:58:06       42 阅读
  3. 数据结构---队列

    2024-05-11 07:58:06       60 阅读
  4. 数据结构:队列

    2024-05-11 07:58:06       56 阅读
  5. 数据结构队列

    2024-05-11 07:58:06       40 阅读
  6. 数据结构队列

    2024-05-11 07:58:06       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-11 07:58:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-11 07:58:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-11 07:58:06       82 阅读
  4. Python语言-面向对象

    2024-05-11 07:58:06       91 阅读

热门阅读

  1. ModbusTCP【C#】

    2024-05-11 07:58:06       29 阅读
  2. windows 集成docker以及镜像管理

    2024-05-11 07:58:06       36 阅读
  3. C++ QT设计模式:访问者模式

    2024-05-11 07:58:06       29 阅读
  4. Php 线程

    2024-05-11 07:58:06       30 阅读
  5. iOS面试题链接汇总

    2024-05-11 07:58:06       29 阅读
  6. es终止快照恢复进程的方法

    2024-05-11 07:58:06       30 阅读
  7. 设计模式:访问者模式

    2024-05-11 07:58:06       33 阅读
  8. HTML批量文件上传3—Servlet批量文件处理FileUpLoad

    2024-05-11 07:58:06       36 阅读
  9. 【Linux】如何查看Linux命令的使用方法

    2024-05-11 07:58:06       37 阅读
  10. SpringBoot MockMvc

    2024-05-11 07:58:06       30 阅读
  11. 【Redis7】10大数据类型之HyperLogLog类型

    2024-05-11 07:58:06       33 阅读
  12. 概率论学习-笔记1

    2024-05-11 07:58:06       29 阅读