当前位置: 首页 > news >正文

嵌入式学习第二十八天--顺序栈

栈的基本代码


栈是限定仅在表尾进行插入和删除操作的线性表。
先进后出、后进先出


栈顶:允许操作的一端
栈底:不允许操作的一端
入栈,出栈。
顺序栈 链式栈
30+2\5
1.创建 CreateSeqStack
2.销毁 DestroySeqStack
3.判断是否为空栈 IsEmptySeqStack
4.判断是否为满栈 IsFullSeqStack
5.压栈 PushSeqStack
6.出栈 PopSeqStack

seqstack.h

#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__

typedef struct person
{
	char name[32];
	char sex;
	int age;
	int score;
} DATATYPE;

typedef struct list
{
	DATATYPE *head;
	int tlen;
	int top; // 相当于clen
} SeqStack;

// 创建
SeqStack *CreateSeqStack(int size);
// 销毁
int DestroySeqStack(SeqStack *ss);
// 新增元素 入栈
int PushSeqStack(SeqStack *ss, DATATYPE *data); // add
// 删除元素 出栈
int PopSeqStack(SeqStack *ss); // del
// 判断是否为空
int IsEmpySeqStack(SeqStack *ss);
// 判断是否为满
int IsFullSeqStack(SeqStack *ss);
// 获得栈顶元素
DATATYPE *GetTopSeqStack(SeqStack *ss);
int GetSizeSeqStack(SeqStack *ss);
#endif

seqstack.c


#include "./seqstack.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// 创建
SeqStack *CreateSeqStack(int size)
{
    SeqStack *ss = malloc(sizeof(SeqStack));
    if (NULL == ss)
    {
        perror("CreateSeqStack malloc error\n");
        return NULL;
    }

    ss->head = malloc(sizeof(DATATYPE) * size);
    if (NULL == ss->head)
    {
        perror("CreateSeqStack malloc2 error\n");
        return NULL;
    }
    ss->tlen = size;
    ss->top = 0;
    return ss;
}
// 销毁
int DestroySeqStack(SeqStack *ss)
{
    if (NULL == ss)
    {
        fprintf(stderr, "DestroySeqStack pamter error\n");
        return 1;
    }
    free(ss->head);
    free(ss);
    return 0;
}
// 新增元素 入栈
int PushSeqStack(SeqStack *ss, DATATYPE *data)
{
    if (NULL == ss || NULL == data || IsFullSeqStack(ss))
    {
        fprintf(stderr, "PushSeqStack pamter error\n");
        return 1;
    }

    memcpy(&ss->head[ss->top], data, sizeof(DATATYPE));
    ss->top++;
    return 0;
}
// 删除元素 出栈
int PopSeqStack(SeqStack *ss)
{
    if (NULL == ss || IsEmpySeqStack(ss))
    {
        fprintf(stderr, "PopSeqStack pamter error\n");
        return 1;
    }
    ss->top--;
    return 0;
}
// 判断是否为空
int IsEmpySeqStack(SeqStack *ss)
{
    return 0 == ss->top;
}
// 判断是否为满
int IsFullSeqStack(SeqStack *ss)
{
    return ss->tlen == ss->top;
}
// 获得栈顶元素
DATATYPE *GetTopSeqStack(SeqStack *ss)
{
    if (NULL == ss || IsEmpySeqStack(ss))
    {
        fprintf(stderr, "GetTopSeqStack pamter error\n");
        return NULL;
    }
    return &ss->head[ss->top - 1];
}

int GetSizeSeqStack(SeqStack *ss)
{
    if (NULL == ss)
    {
        fprintf(stderr, "GetSizeSeqStack pamter error\n");
        return -1;
    }
    return ss->top;
}

main.c


#include "./seqstack.h"
#include <stdio.h>

int main(int argc, char **argv)
{
    SeqStack *ss = CreateSeqStack(5);
    DATATYPE data[] = {
        {"zhangsan", 'm', 20, 80},
        {"lisi", 'f', 22, 86},
        {"wangmazi", 'f', 22, 67},
        {"guanerge", 'm', 40, 88},
        {"liubei", 'm', 42, 90},
    };

    int i = 0;
    for (i = 0; i < 5; i++)
    {
        PushSeqStack(ss, &data[i]);
    }

    int len = GetSizeSeqStack(ss);
    for (i = 0; i < len; i++)
    {
        DATATYPE *tmp = GetTopSeqStack(ss);
        printf("name:%s age:%d\n", tmp->name, tmp->age);
        PopSeqStack(ss);
    }

    DestroySeqStack(ss);
    // system("pause");
    return 0;
}

练习

遍历一个文件,查找文件中字符")" ,"]","}"是否存在正确的配对字符,如果不存在,打印错误信息,找出错误在文件中的第几行,以及是上面三种字符中的哪种字符导致的错误

seqstack.h

#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__

typedef struct person
{
	char sym;
	int linenum;
	int colnum;
} DATATYPE;

typedef struct list
{
	DATATYPE *head;
	int tlen;
	int top; // 相当于clen
} SeqStack;

// 创建
SeqStack *CreateSeqStack(int size);
// 销毁
int DestroySeqStack(SeqStack *ss);
// 新增元素 入栈
int PushSeqStack(SeqStack *ss, DATATYPE *data); // add
// 删除元素 出栈
int PopSeqStack(SeqStack *ss); // del
// 判断是否为空
int IsEmpySeqStack(SeqStack *ss);
// 判断是否为满
int IsFullSeqStack(SeqStack *ss);
// 获得栈顶元素
DATATYPE *GetTopSeqStack(SeqStack *ss);
int GetSizeSeqStack(SeqStack *ss);
#endif

seqstack.c


#include "./seqstack.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// 创建
SeqStack *CreateSeqStack(int size)
{
    SeqStack *ss = malloc(sizeof(SeqStack));
    if (NULL == ss)
    {
        perror("CreateSeqStack malloc error\n");
        return NULL;
    }

    ss->head = malloc(sizeof(DATATYPE) * size);
    if (NULL == ss->head)
    {
        perror("CreateSeqStack malloc2 error\n");
        return NULL;
    }
    ss->tlen = size;
    ss->top = 0;
    return ss;
}
// 销毁
int DestroySeqStack(SeqStack *ss)
{
    if (NULL == ss)
    {
        fprintf(stderr, "DestroySeqStack pamter error\n");
        return 1;
    }
    free(ss->head);
    free(ss);
    return 0;
}
// 新增元素 入栈
int PushSeqStack(SeqStack *ss, DATATYPE *data)
{
    if (NULL == ss || NULL == data || IsFullSeqStack(ss))
    {
        fprintf(stderr, "PushSeqStack pamter error\n");
        return 1;
    }

    memcpy(&ss->head[ss->top], data, sizeof(DATATYPE));
    ss->top++;
    return 0;
}
// 删除元素 出栈
int PopSeqStack(SeqStack *ss)
{
    if (NULL == ss || IsEmpySeqStack(ss))
    {
        fprintf(stderr, "PopSeqStack pamter error\n");
        return 1;
    }
    ss->top--;
    return 0;
}
// 判断是否为空
int IsEmpySeqStack(SeqStack *ss)
{
    return 0 == ss->top;
}
// 判断是否为满
int IsFullSeqStack(SeqStack *ss)
{
    return ss->tlen == ss->top;
}
// 获得栈顶元素
DATATYPE *GetTopSeqStack(SeqStack *ss)
{
    if (NULL == ss || IsEmpySeqStack(ss))
    {
        fprintf(stderr, "GetTopSeqStack pamter error\n");
        return NULL;
    }
    return &ss->head[ss->top - 1];
}

int GetSizeSeqStack(SeqStack *ss)
{
    if (NULL == ss)
    {
        fprintf(stderr, "GetSizeSeqStack pamter error\n");
        return -1;
    }
    return ss->top;
}

main.c



#include "./seqstack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int do_chekc(char *buf, SeqStack *ss, int num)
{
    int col = 1;
    DATATYPE data;

    while (*buf)
    {
        DATATYPE *tmp = NULL;
        bzero(&data, sizeof(data));
        int c = *buf;
        switch (c)
        {
        case '(':
        case '[':
        case '{':
            data.sym = c;
            data.linenum = num;
            data.colnum = col;
            PushSeqStack(ss, &data);
            break;
        case ')':
            tmp = GetTopSeqStack(ss);
            if (NULL == tmp)
            {
                printf("read sym:%c ,line:%d col:%d\n", c, num, col);
                return 1;
            }
            if ('(' == tmp->sym)
            {
                PopSeqStack(ss);
            }
            else
            {
                printf("read sym:%c ,line:%d col:%d  or top sym:%c ,line:%d col:%d\n", c, num, col, tmp->sym, tmp->linenum, tmp->colnum);
                return 1;
            }

            break;
        case ']':
            tmp = GetTopSeqStack(ss);
            if (NULL == tmp)
            {
                printf("read sym:%c ,line:%d col:%d\n", c, num, col);
                return 1;
            }
            if ('[' == tmp->sym)
            {
                PopSeqStack(ss);
            }
            else
            {
                printf("read sym:%c ,line:%d col:%d  or top sym:%c ,line:%d col:%d\n", c, num, col, tmp->sym, tmp->linenum, tmp->colnum);
                return 1;
            }

            break;
        case '}':
            tmp = GetTopSeqStack(ss);
            if (NULL == tmp)
            {
                printf("read sym:%c ,line:%d col:%d\n", c, num, col);
                return 1;
            }
            if ('{' == tmp->sym)
            {
                PopSeqStack(ss);
            }
            else
            {
                printf("read sym:%c ,line:%d col:%d  or top sym:%c ,line:%d col:%d\n", c, num, col, tmp->sym, tmp->linenum, tmp->colnum);
                return 1;
            }

            break;
        }

        buf++;
        col++;
    }
    return 0;
}
int main(int argc, char **argv)
{
    SeqStack *ss = CreateSeqStack(100);
    FILE *fp = fopen("./hello.c", "r");
    if (NULL == fp)
    {
        perror("fopen");
        return 1;
    }
    int num = 1;
    int ret = 0;
    while (1)
    {
        char buf[256] = {0};
        if (NULL == fgets(buf, sizeof(buf), fp))
        {

            break;
        }
        ret = do_chekc(buf, ss, num);
        if (1 == ret)
        {
            DestroySeqStack(ss);
            exit(1);
        }
        num++;
    }

    if (IsEmpySeqStack(ss))
    {
        printf("file ok\n");
    }
    else
    {
        DATATYPE *tmp = GetTopSeqStack(ss);
        printf("top sym:%c ,line:%d col:%d\n", tmp->sym, tmp->linenum, tmp->colnum);
    }

    DestroySeqStack(ss);
    // system("pause");
    return 0;
}

例如创建一个hello.c文件,其中文件少了一个);

运行结果:

相关文章:

  • apache连接池机制讨论
  • C#:类型定义中使用‌问号(?)
  • Git 提示 “LF will be replaced by CRLF“ 的原因及解决方案
  • 【安全】记录钓鱼邮件中木马病毒的分析溯源
  • WPF 附加属性
  • MySQL锁等待超时问题的排查与解决
  • Python 爬虫:一键解锁 3GPP 标准协议下载难题
  • 基于Netlify + Localtunnel 实现本地项目“无服务器”部署上线
  • 资产管理存储技术栈的二十年演进:从大数据存储到AI驱动的智能管理
  • LeetCode 235. 二叉搜索树的最近公共祖先 java题解
  • 练习:猜数字小游戏
  • SRT协议
  • 企业微信token及相关接口关联分析
  • 界面控件Telerik和Kendo UI 2025 Q1亮点——AI集成与数据可视化
  • leetcode543.二叉树的直径
  • 【系统架构设计师】数据库系统 ② ( 分布式数据库 | 分布式数据库 特点 | 分布式数据库 分层模式 | 两阶段提交协议 - 2PC 协议 )
  • 浅谈WebSocket-FLV
  • 【Mysql】SQL 优化全解析
  • Java爬虫如何解析返回的JSON数据?
  • H3C 防火墙上配置端口映射
  • wordpress添加vip用户组/外贸seo网站
  • 福建seo网站/朝阳网站建设
  • 口碑好网站建设在哪里/美工培训
  • 商务网站系统中支付功能怎么做/免费发帖平台
  • 做微信的网站叫什么/沈阳网站优化
  • react做的电商网站能上线吗/seo是什么意思蜘蛛屯