苏嵌实训——day10(下)

简介: 苏嵌实训——day10(下)

2.2.4 入栈


//入栈
void SeqStackPush(seqstack *s,DataType value)
{
    if(SeqStackIsFull(s))
    {
        printf("栈满了!\n");
        return;
    }
    s->pos++;
    s->data[s->pos] = value;
    return;
}


2.2.5 出栈


//出栈
DataType SeqStackPop(seqstack *s)
{
    if(SeqStackIsEmpty(s))
    {
        printf("栈为空!\n");
        return (DataType)-1;
    }
    DataType value = s->data[s->pos];
    s->pos--;
    return value;
}


2.3 链栈(链式栈)


0a2653c851af460fa595bd959398a8f1.png

整体代码


mian.c
//main.c
#include "linkstack.h"
int main(int argc, char const *argv[])
{
    stack s;
    InitStack(&s);
    push(&s,100);
    push(&s,200);
    push(&s,300);
    push(&s,400);
    push(&s,500);
    push(&s,600);
    push(&s,700);
    while(!EmptyStack(&s))
    {
        printf("出栈:%d\n",pop(&s));
    }
    return 0;
}


linkstack.c

//linkstack.c
#include "linkstack.h"
//初始化栈信息
void InitStack(stack *s)
{
    s->length = 0;
    s->top = NULL;
}
//入栈
void push(stack *s,DataType value)
{
    if(NULL == s)
    {
        printf("栈空间分配失败,初始化失败!\n");
        return ;
    }
    Node *tmp = (Node *)malloc(sizeof(Node));
    tmp->next = NULL;
    tmp->data = value;
    tmp->next = s->top;
    s->top = tmp;
    s->length++;
}
//获取栈顶元素
DataType GetTop(stack *s)
{
    if(NULL == s)
    {
        return (DataType)-1;
    }
    if(s->top == NULL)
    {
        return (DataType)-1;
    }
    return s->top->data;
}
//出栈
DataType pop(stack *s)
{
    if(NULL == s)
    {
        return (DataType)-1;
    }
    if(s->top == NULL)
    {
        return (DataType)-1;
    } 
    Node *tmp = s->top;
    s->top = tmp->next;
    DataType value = tmp->data;
    free(tmp);
    tmp = NULL;
    s->length--;
    return value;
}
//判断栈是否为空
int EmptyStack(stack *s)
{
    return s->top == NULL ? 1 : 0;
}
//清空栈
int ClearStack(stack *s)
{
    if(NULL == s)
    {
        return (DataType)-1;
    }
    if(s->top == NULL)
    {
        return (DataType)-1;
    }
    Node *tmp = s->top;
    while(tmp)
    {
        s->top = tmp->next;
        free(tmp);
        tmp = s->top;
        s->length--;
    }     
    return 1;
}


练习 四则运算器


0a2653c851af460fa595bd959398a8f1.png

//判断符号的优先级
int Priority(char ch)
{
    switch (ch)
    {
    case '(':
        return 3;
    case '*':
    case '/':
        return 2;
    case '+':
    case '-':
        return 1;
    default:
        return 0;
    }
}
//四则混合计算器
void calculator()
{
    stack s_sum, s_opt;
    InitStack(&s_sum);
    InitStack(&s_opt);
    char opt[128] = {0};
    printf("请输入表达式:\n");
    scanf("%s",opt);
    int i = 0,tmp = 0,num1,num2;
    while(opt[i] != '\0' || EmptyStack(&s_opt) != 1)
    {
        if(opt[i] >= '0' && opt[i] <= '9')   //运算数
        {
            tmp = tmp *10 + opt[i] - '0';
            i++;
            if(opt[i] < '0' || opt[i] > '9')
            {
                push(&s_sum,tmp);
                tmp = 0;
            }
        }
        else   //操作符
        {
            if(EmptyStack(&s_opt) == 1 || Priority(opt[i]) > Priority(GetTop(&s_opt))||
            (GetTop(&s_opt) == '(' && opt[i] != ')'))
            {
                push(&s_opt,opt[i]);
                i++;
                continue;
            }
            if(GetTop(&s_opt) == '(' && opt[i] == ')')
            {
                pop(&s_opt);
                i++;
                continue;
            }
            if(Priority(opt[i]) <= Priority(GetTop(&s_opt)) ||opt[i] == ')' && GetTop(&s_opt)!= '('||
            opt[i] == '\0' && EmptyStack(&s_opt) != 1)
            {
                switch (pop(&s_opt))
                {
                case '+':
                    num1 = pop(&s_sum);
                    num2 = pop(&s_sum);
                    push(&s_sum,num1 + num2);
                    break;
                case '-':
                    num1 = pop(&s_sum);
                    num2 = pop(&s_sum);
                    push(&s_sum,num2 - num1);
                    break;
                case '*':
                    num1 = pop(&s_sum);
                    num2 = pop(&s_sum);
                    push(&s_sum,num1 * num2);
                    break;
                case '/':
                    num1 = pop(&s_sum);
                    num2 = pop(&s_sum);
                    push(&s_sum,num2 / num1);
                    break;               
                default:
                    break;
                }
            }
        }
    }
    printf("%d\n",GetTop(&s_sum));
}
相关文章
Pyside6-第八篇-QLabel文本标签
Pyside6-第八篇-QLabel文本标签
745 0
修改elementui table 组件滚动条样式
修改elementui table 组件滚动条样式
240 0
|
7月前
|
人工智能 测试技术 API
PaperBench:OpenAI开源AI智能体评测基准,8316节点精准考核复现能力
PaperBench是OpenAI推出的开源评测框架,通过8316个评分节点系统评估AI智能体复现学术论文的能力,涵盖理论理解、代码实现到实验执行全流程。
426 30
PaperBench:OpenAI开源AI智能体评测基准,8316节点精准考核复现能力
|
7月前
|
JavaScript 程序员 UED
如何快速搭建自己的个人网站?Hexo、VuePress 和 WordPress 大比拼!
晚枫和你聊聊程序员必备的个人网站!它是技术名片,能秀实力、记笔记、当博主、搞品牌。搭建工具有三种:Hexo简单快速,适合技术博客;VuePress功能丰富,可玩转动态交互;WordPress强大全面,适合复杂项目但维护成本高。根据需求选择工具,像选女朋友一样慎重哦!快来分享你的想法,一起探讨吧!记得点赞收藏不迷路~
233 17
|
前端开发
基于jeecgboot的大屏设计器开发——数据集设计(一)
基于jeecgboot的大屏设计器开发——数据集设计(一)
258 3
|
Windows
LabVIEW强制重新安装无法运行或损坏的NI软件
LabVIEW强制重新安装无法运行或损坏的NI软件
202 1
|
机器学习/深度学习 人工智能 供应链
智能进化:AI技术如何重塑智能手机体验
【7月更文第31天】随着人工智能(AI)技术的飞速发展,智能手机已经成为AI应用的重要平台之一。本文将探讨AI如何改善智能手机的用户体验,分析AI技术在手机硬件中的具体应用案例,并讨论AI技术如何帮助智能手机制造商应对市场挑战。
507 2
|
数据处理 定位技术 开发者
甘特图、IPO图、DFD图
甘特图、IPO图、DFD图
|
Web App开发 缓存 移动开发
四万字符数带你使用 Vitepress 构建博客并部署到 github 平台
四万字符数带你使用 Vitepress 构建博客并部署到 github 平台 最近写了好多篇 Chrome 浏览器插件相关的文章,有十几二十篇,就想着构建个博客,用来放置相应的文章。 正好前段时间看到 VitePress 1.0.0 发布了,而且是用 markdown 写文章,正好写插件文章的时候文章都是 md 格式,所有用下这个然后顺便写一篇使用教程。 Chrome 插件开发博客地址:https://18055975947.github.io/extension/
311 0
|
存储 NoSQL 算法
Redis持久化——RDB机制详解
Redis提供了RDB和AOF的持久化选项。本文主要介绍RDB的核心概念、触发方式、文件结构及优缺点。RDB(Redis DataBase) ,意为快照/内存快照,RDB持久化是把当前进程数据生成快照保存到磁盘上的过程
下一篇
开通oss服务