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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/611247.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单调栈:(C++)

在题目的要求中&#xff0c;存在先进后出&#xff08;即在前面的数据需要遍历到后面的某一数据时才能确定计算值&#xff09;单调栈在一部分解题场景中避免了暴力解法的高时间复杂度问题&#xff0c;但是在做题过程中视情况而定&#xff0c;有些题目的最优解不一定使用单调栈&a…

【原创】springboot+mysql物资库存管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

利用AI提高内容生产效率的五个方案

目录 如何利用AI提高内容生产效率? ​编辑方向一&#xff1a;自动化内容生成 方向二&#xff1a;内容分发与推广 方向三&#xff1a;内容分析与优化 方向四&#xff1a;图像和音频处理 方向五&#xff1a;自动编辑和校对 如何利用AI提高内容生产效率? 简介&#xff1a…

车载电子电器架构 —— 应用软件开发(上)

车载电子电器架构 —— 应用软件开发(上) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

CellChat包文献介绍

Inference and analysis of cell-cell communication using CellChat - PubMed (nih.gov) 目录 在线数据 摘要 基础介绍 分析结果 1&#xff0c;概述 2&#xff0c;识别预测通路 3&#xff0c;连续的信号转导 4&#xff0c;预测空间共定位细胞群之间的关键信号转导事件…

企业活动想联系媒体报道宣传如何联系媒体?

在企业的宣传推广工作中,我曾经历过一段费事费力、效率极低的时期。那时,每当公司有重要活动或新项目需要媒体报道时,我便要一家家地联系媒体,发送邮件、打电话,甚至亲自登门拜访,只为求得一篇报道。然而,这样的过程充满了不确定性和挑战,时常让我感到焦虑和压力山大。 记得有一…

vue3专栏项目 -- 项目介绍以及准备工作

这是vue3TS的项目&#xff0c;是一个类似知乎的网站&#xff0c;可以展示专栏和文章的详情&#xff0c;可以登录、注册用户&#xff0c;可以创建、删除、修改文章&#xff0c;可以上传图片等等。 这个项目全部采用Composition API 编写&#xff0c;并且使用了TypeScript&#…

亚马逊产品排名提升全攻略:自养号测评干货

之前我们一同探讨了亚马逊产品排名的多种类型&#xff0c;现在让我们回到正题&#xff0c;探讨一下如何才能有效地提升产品排名&#xff0c;从而吸引并抓住平台的流量&#xff0c;最终将其转化为可观的销量。 首先&#xff0c;卖家必须明晰亚马逊的排名机制&#xff0c;它主要基…

网页版Figma汉化

最近学习Figma&#xff0c;简单介绍一下网页版Figma的汉化方法 1.打开网址&#xff1a;Figma软件汉化-Figma中文版下载-Figma中文社区 2.下载汉化插件离线包 解压汉化包 3.点开谷歌的管理扩展程序 4.点击加载已解压的扩展程序&#xff0c;选择刚刚解压的包 这样就安装好了汉化…

从0到1开发一个vue3+ts项目(一)

1. 环境配置 1.1 安装node 使用官方安装程序 前往 Node.js 官网&#xff1a;访问 Node.js 官网&#xff0c;下载适合你操作系统的安装程序。运行安装程序&#xff1a;下载完成后&#xff0c;双击安装程序并按照提示进行安装。验证安装&#xff1a;安装完成后&#xff0c;在终…

顺序表经典算法OJ题-- 力扣27,88

题1&#xff1a; 移除元素 题2&#xff1a; 合并两个有序数组 一&#xff1a;题目链接&#xff1a;. - 力扣&#xff08;LetCode&#xff09; 思路&#xff1a;&#xff08;双指针法&#xff09; 创建两个变量src&#xff0c;dst 1&#xff09;若src指向的值为val&#xf…

Qt复习第二天

1、菜单栏工具栏状态栏 #include "mainwindow.h" #include "ui_mainwindow.h" #pragma execution_character_set("utf-8"); MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//菜…

粤嵌—2024/4/26—跳跃游戏 ||

代码实现&#xff1a; 方法一&#xff1a;回溯 历史答案剪枝优化——超时 int *dis;void dfs(int k, int startindex, int *nums, int numsSize) {if (dis[startindex] < k) {return;}dis[startindex] k;for (int i 0; i < nums[startindex]; i) {if (startindex i &…

嫁接打印的技术要点

所谓嫁接打印&#xff0c;是一种增减材混合制造的方式。它将已成形的模具零件当作基座&#xff0c;在此基础上“生长”出打印的零件。其中基座通常采用传统加工方式制造&#xff0c;而打印部分则使用专用的金属粉末&#xff0c;通过 3D 打印技术成型。 嫁接打印之所以备受欢迎&…

4.nginx.pid打开失败以及失效的解决方案

一. nginx.pid打开失败以及失效的解决方案 1.错误图片&#xff1a; 2.解决方法 步骤1&#xff1a;进入这个目录 /var/run/nginx,提示没有文件或目录&#xff0c;则使用mkdir创建这个目录。 步骤2&#xff1a;然后 ./nginx -s reload 运行,是一个无效的PID 步骤3&#xff1a;使…

SMI接口

目录 SMI 接口帧格式读时序写时序 IP 设计IP 例化界面IP 接口IP 验证 SMI 接口 SMI&#xff08;Serial Management Interface&#xff09;串行管理接口&#xff0c;也被称作 MII 管理接口&#xff08;MII Management Interface&#xff09;&#xff0c;包括 MDC 和 MDIO 两条信…

【字符串】Leetcode 二进制求和

题目讲解 67. 二进制求和 算法讲解 为了方便计算&#xff0c;我们将两个字符串的长度弄成一样的&#xff0c;在短的字符串前面添加字符0&#xff1b;我们从后往前计算&#xff0c;当遇到当前计算出来的字符是> 2’的&#xff0c;那么就需要往前面进位和求余 注意&#xf…

《QT实用小工具·六十二》基于QT实现贝塞尔曲线画炫酷的波浪动画

1、概述 源码放在文章末尾 该项目实现了通过贝塞尔曲线画波浪动画&#xff0c;可控制 颜色密度速度加速度 安装与运行环境 语言&#xff1a;C 框架&#xff1a;Qt 11.3 平台&#xff1a;Windows 将屏幕水平平均分为10块&#xff0c;在一定范围内随机高度的12个点&#xff08;…

OAuth 2.0 和 OAuth 2.1

OAuth 2.0 和 OAuth 2.1比较&#xff1a; OAuth 2.0 和 OAuth 2.1 是授权框架的不同版本&#xff0c;它们用于允许应用程序安全地访问用户在另一个服务上的数据。以下是它们之间的一些主要区别&#xff1a; 安全性增强&#xff1a;OAuth 2.1 旨在提高安全性&#xff0c;它整合…

C语言/数据结构——每日一题(移除链表元素)

一.前言 今天在leetcode刷到了一道关于单链表的题。想着和大家分享一下。废话不多说&#xff0c;让我们开始今天的知识分享吧。 二.正文 1.1题目要求 1.2思路剖析 我们可以创建一个新的单链表&#xff0c;然后通过对原单链表的遍历&#xff0c;将数据不等于val的节点移到新…
最新文章