数据结构 栈的应用一(就近匹配)

//栈的应用--就近匹配
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"LinkStack.h"//引用链表栈动态库

/*
思路:遍历每个字符,遇到左符号压栈,遇到右符号出栈,比较出栈的符号是否和右符号匹配,遇到普通符号不管
*/

//符号处理
int ProtectSymbol(char ch, LinkStack *stack){
    char tempc = 0, * tempc2=NULL,*temp3=NULL;
    switch (ch)
    {
    case ‘<‘:
    case ‘(‘:
    case ‘[‘:
    case ‘{‘:
        //压栈操作
        //必须malloc内存 不然压栈的就是局部变量   局部变量会被释放的
        temp3 = (char *)malloc(sizeof(char));
        memset(temp3, 0, sizeof(char));
        *temp3 = ch;
        LinkStack_Push(stack, temp3);
        break;
    case ‘>‘:
        tempc = ‘<‘;
        break;
    case ‘)‘:
        tempc = ‘(‘;
        break;
    case ‘]‘:
        tempc = ‘[‘;
        break;
    case ‘}‘:
        tempc = ‘{‘;
    default:
        break;
    }
    if (tempc!=0)
    {
        //出栈操作
        tempc2 = (char *)LinkStack_Pop(stack);
        if (tempc2 != NULL)
        {
            if (tempc != *tempc2)
            {
                printf("不匹配的符号是%c\n", tempc);
                //释放内存
                free(tempc2);
                tempc2 = NULL;
                return 1;
            }
            //释放内存
            free(tempc2);
            tempc2 = NULL;
        }
    }
    return 0;
}

//遍历字符串
void ProtectStr(char *pin, LinkStack *stack){
    if (pin==NULL)
    {
        return;
    }
    char *temp = pin;
    char *temp3 = NULL;
    int ret = 0;
    while (*temp){
        ret = ProtectSymbol(*temp, stack);
        if (ret!=0)
        {
            printf("符号不匹配!\n");
            return;
        }
        temp++;
    }
    //判断栈中是否还有元素  有证明 符号缺失
    while (LinkStack_Size(stack)){
        //取出栈顶元素
        temp3 = (char *)LinkStack_Pop(stack);
        if (temp3 != NULL)
        {
            printf("符号%c没有匹配\n", *temp3);
            //释放内存
            free(temp3);
            temp3 = NULL;
        }
    }
}

void main(){
    char *restr = "#include <stdio.h> int main() { int a[4][4]; int (*p)[4]; p = a[0]; return 0;";
    //char *restr = "<1";
    //准备栈对象
    LinkStack *stack = LinkStack_Create();
    if (stack==NULL)
    {
        return;
    }
    ProtectStr(restr, stack);
    //销毁链表
    LinkStack_Destroy(&stack);

    system("pause");
}

时间: 2024-08-24 22:12:53

数据结构 栈的应用一(就近匹配)的相关文章

数据结构-栈的实现之括号匹配检测

假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先检测栈是否为空, 若栈空则表明此右括弧多余,表达式不匹配. 否则和栈顶数据比较,若匹配则栈顶出栈. 否则表明表达式不匹配: 最后若栈空且没有做鱼右括弧则匹配正确,否则表明不匹配. 实现代码如下(Stack.h头文件为之前写的数据结构-栈的顺序结构中写的数组那个方法,用到了里面栈的结构和连个基本栈操作

栈的应用 - 就近匹配

链式存储栈的API详情參看我的博文:栈的链式存储 - API实现 就近匹配 差点儿全部的编译器都具有检測括号是否匹配的能力 怎样实现编译器中的符号成对检測? #include <stdio.h> int main() { int a[4][4]; int (*p)[4]; p = a[0]; return 0; 算法思路 从第一个字符開始扫描 当遇见普通字符时忽略. 当遇见左符号时压入栈中 当遇见右符号时从栈中弹出栈顶符号.并进行匹配 匹配成功:继续读入下一个字符 匹配失败:马上停止.并报错

C数据结构-栈和队列,括号匹配举例

1.栈和队列是两种特殊的线性表 运算操作被限定只能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构造一个空栈 2).Stackempty(s) 判断s是否为空栈,当s为空栈时,函数返回值1 否则 0 3).Push(&s,x)  在栈s 的顶部插入元素x,简称将x入 栈 4).Pop(&s,&x) 在栈s 中删除顶元并将其值保存在x单元中返回,简称将x出栈 5)Gettop(s,&x)  读s栈中的

数据结构 栈的实例应用,括号匹配

引用栈的顺序存储,实现括号匹配问题查找: 头文件: #pragma once #include<string.h> #include<stdlib.h> #define MAX 1024 //顺序栈 struct SeqStack{ void *data[MAX]; int size; }; #ifdef __cplusplus extern "C"{ #endif //初始化栈 void *Init_SeqStack(); //入栈 void Push_Seq

C# 数据结构 栈 Stack

栈和队列是非常重要的两种数据结构,栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素和元素的逻辑关系也相同 差别在于:线性表的操作不受限制,栈和队列操作受限制(遵循一定的原则),因此栈和队列也称为受限制的线性表. 栈的定义:操作在表的尾端进行的线性表,栈顶:TOP,栈底:Bottom.栈中没有数据:空栈Empty Stack 表示方法:S=(a1,a2,a3,a4……..an)a1为栈底的元素,an为栈顶的元素.这N个数据按照先后顺序插入到栈内,找出栈内数据则相反 遵循的原则(Las

HDU 1022 Train Problem I (数据结构 —— 栈)

Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want to get back to school by train(because the trains in the Ignatius Train Station is the fastest all over the world ^v^). But here comes

数据结构---栈及四则运算实现

假设我们要求输入类似这样一个表达式:9+(3-1)*3+10/2,输出结果.我们知道先括号,再乘除,最后加减,中学时候使用的科学计算器,是允许输入这样的表达式计算结果的,那么计算机怎么知道这个串里面先算括号再算乘除呢?我们先来介绍下栈这种数据结构,再来解决这个问题. 前面已经说过数组的连表,现在来说另外一种线性表的数据结构---栈. 举个比较形象的例子,洗盘子的时候,是不是一个一个往上面堆着放,拿的时候也从上面一个一个的拿,最先放的在最下面,最后放的在最上面,拿的时候第一个拿到.这就是典型的栈结

南阳OJ-2 括号配对 (数据结构-栈的应用)

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

数据结构 栈的应用

题目描述 请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为"(", ")", "[", "]", "{", "}",这三个括号可以按照任意的次序嵌套使用. 输入 有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行. 输出 对每个表达式,若其中的括号是匹配的,则输出"yes",否则输出"no". 样例输入 4 [(d+f