IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 栈的应用——就近匹配 (C语言) -> 正文阅读

[数据结构与算法]栈的应用——就近匹配 (C语言)

就近匹配

在开发的过程中,我们常常遇到成对出现的符号,比如"(" 与")",如果算式中仅仅出现其中一个,则说明算式错误。运用栈一数据结构模型,可以很好进行匹配。
算法思路:
1、从第一个字符开始扫描
2、遇见普通字符时忽略
3、当遇见左括号时压入栈中
4、当遇见右括号时弹出返回栈顶元素,并进行匹配
5、匹配成功,进入下一个字符
6、匹配失败,立即停止并进行报错
7、结束:
成功:所有字符匹配完毕,且栈为空
失败:匹配失败或者所有字符扫描完毕但是栈为非空

代码

"seqStack.h"文件

包含了栈的模型结构与常用接口声名

#pragma  once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define  MAX 1024

//struct SStack
//{
//	void * data[MAX];  //栈的数组
//
//	int m_Size; //栈大小
//};

typedef void * SeqStack;

//初始化栈
SeqStack init_SeqStack();

//入栈
void push_SeqStack(SeqStack stack, void * data);

//出栈
void pop_SeqStack(SeqStack stack);

//返回栈顶
void * top_SeqStack(SeqStack stack);

//返回栈大小
int size_SeqStack(SeqStack stack);

//判断栈是否为空
int isEmpty_SeqStack(SeqStack stack);

//销毁栈
void destroy_SeqStack(SeqStack stack);

"seqStack.c"文件

包含了栈的各自接口的实现,看不懂不了解栈模型的欢迎查看本栏数据结构-线性栈
数据结构 -链表栈

#include "seqStack.h"

struct SStack
{
	void * data[MAX];  //栈的数组

	int m_Size; //栈大小
};

//初始化栈
SeqStack init_SeqStack()
{
	struct SStack * myStack = malloc(sizeof(struct SStack));

	if (myStack == NULL)
	{
		return NULL;
	}

	//初始化数组
	memset(myStack->data, 0, sizeof(void *)* MAX);

	//初始化栈大小
	myStack->m_Size = 0;

	return myStack;
}
//入栈
void push_SeqStack(SeqStack stack, void * data)
{
	//入栈本质  --- 数组尾插
	if (stack == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}

	struct SStack * mystack = stack;
	if (mystack->m_Size == MAX)
	{
		return;
	}

	mystack->data[mystack->m_Size] = data;

	mystack->m_Size++;
}
//出栈
void pop_SeqStack(SeqStack stack)
{
	//出栈本质  --- 数组尾删
	if (stack == NULL)
	{
		return;
	}

	struct SStack * mystack = stack;

	if (mystack->m_Size == 0)
	{
		return;
	}

	mystack->data[mystack->m_Size - 1] = NULL;

	mystack->m_Size--;

}
//返回栈顶
void * top_SeqStack(SeqStack stack)
{
	if (stack == NULL)
	{
		return NULL;
	}

	struct SStack * mystack = stack;

	if (mystack->m_Size == 0)
	{
		return NULL;
	}
	return mystack->data[mystack->m_Size - 1];
}
//返回栈大小
int size_SeqStack(SeqStack stack)
{
	if (stack == NULL)
	{
		return -1;
	}

	struct SStack * mystack = stack;

	return mystack->m_Size;

}
//判断栈是否为空
int isEmpty_SeqStack(SeqStack stack)
{
	if (stack == NULL)
	{
		return -1;//返回-1代表真  空栈
	}

	struct SStack * mystack = stack;

	if (mystack->m_Size == 0)
	{
		return 1;
	}

	return 0; //返回0 代表 不是空栈

}
//销毁栈
void destroy_SeqStack(SeqStack stack)
{
	if (stack == NULL)
	{
		return;
	}

	free(stack);
	stack = NULL;
}

具体实现代码

//
// Created by szw on 2021/9/23.
//

#include "Proximity matching of stacks.h"
#include <stdio.h>
#include "stdlib.h"
#include "string.h"
#include "seqStack.h"

//算法思路
/*
 * 栈的应用案例
就近匹配
 1、从第一个字符开始扫描
 2、遇见普通字符时忽略
 3、当遇见左括号时压入栈中
 4、当遇见右括号时弹出返回栈顶元素,并进行匹配
 5、匹配成功,进入下一个字符
 6、匹配失败,立即停止并进行报错
 7、结束:
 成功:所有字符匹配完毕,且栈为空
 失败:匹配失败或者所有字符扫描完毕但是栈为非空
 */
//判断左括号
int isLeft(char * p)
{
    return '('== *p;
}
//判断右括号
int isRight(char * p)
{
    return ')' ==* p;
}
//打印错误函数
void printError(char *str ,char *Msg ,char *pos)
{
    printf("错误信息:%s\n",Msg);
    printf("%s\n",str);
    int mis_num = pos - str;//计算出错位置
    for (int i = 0; i <mis_num ; ++i) {
        printf(" ");
    }
    printf("^\n");
}
void test01(){
//    char *str = "5+5*(6)+9/3*1)-(1+3(";
    char *str =  "5+5*(6)+9/3*1-(1+3(";
    //定义一个指针指向字符串的首地址
    char * p =str;
    //初始化栈
    SeqStack  myStack = init_SeqStack();
    //开始循环扫描操作
    while (*p != '\0')
    {
        //判断如果是左括号,则进行入栈
        if (isLeft(p)){
            push_SeqStack(myStack,p);
        }
        //如果是右括号
        if (isRight(p))
        {
            //情况1 如果是空栈报错
            //情况2 不为空栈,出栈
            if(size_SeqStack(myStack)>0)
            {
                //情况2
                pop_SeqStack(myStack);
            }
            else
            {
                //情况1 立即停止报错
                printError(str,"右括号无法匹配左括号",p);
                break;
            }

        }
        p++;
    }
    //左括号没有匹配到右括号的情况
    //如果没有匹配到,栈一定不为空
    while (size_SeqStack(myStack)>0)
    {
        printError(str,"左括号没有匹配到右括号", top_SeqStack(myStack));
        pop_SeqStack(myStack);
    }
    //销毁栈
    destroy_SeqStack(myStack);

}


int main() {
    test01();
    return 0;
}

运行图例

在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:50:25  更:2021-09-24 10:53:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 10:48:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码