栈应用_检测成对符号是否正确使用(代码、分析、汇编)

代码:

LinkList.h
LinkList.c
LinkStack.h
LinkStack.c
栈-线性表

main.c

#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"

//该程序是检查字符串中的出现一对符号时,有没有出现交叉错误使用
/*
比如: < ( > )  这种情况检测失败
       < > ( ) 这种情况检测成功
       < ( ) > 这种情况检测成功 
*/

int isLeft(char c)//是否一对符号的左边
{
    
    
    int ret = 0;
    
    switch(c)
    {
    
    
        case '<':
        case '(':
        case '[':
        case '{':
        case '\'':
        case '\"':
            ret = 1;
        	break;
        default:
            ret = 0;
            break;
    }
    
    return ret;
}

int isRight(char c)//是否是一对符号的右边
{
    
    
    int ret = 0;
    
    switch(c)
    {
    
    
        case '>':
        case ')':
        case ']':
        case '}':
        case '\'':
        case '\"':
            ret = 1;
        	break;
        default:
            ret = 0;
            break;
    }
    
    return ret;
}

int match(char left, char right)//配对是否是一对符号
{
    
    
    int ret = 0;
    
    switch(left)
    {
    
    
        case '<':
            ret = (right == '>');
            break;
        case '(':
            ret = (right == ')');
            break;
        case '[':
            ret = (right == ']');
            break;
        case '{':
            ret = (right == '}');
            break;
        case '\'':
            ret = (right == '\'');
            break;
        case '\"':
            ret = (right == '\"');
            break;
        default:
            ret = 0;
            break;
    }
    
    return ret;
}

int scanner(const char* code)//字符串检测函数
{
    
    
    LinkStack* stack = LinkStack_Create();//创建栈
    int ret = 0;
    int i = 0;
    
    while( code[i] != '\0' )//将字符串中每个字符比较
    {
    
    
        if( isLeft(code[i]) )//如果是一对字符的左边部分
        {
    
    
            LinkStack_Push(stack, (void*)(code + i));//将该字符地址添加进栈
        }
        
        if( isRight(code[i]) )//如果是一对字符的右边部分
        {
    
    
            char* c = (char*)LinkStack_Pop(stack);//取出数据出栈
            
            if( (c == NULL) || !match(*c, code[i]) )//如果数据等于空或者这两边字符并不是一对
            {
    
    
                printf("%c does not match!\n", code[i]);//输出该字符没有配对成功
                ret = 0;
                break;//退出查找字符串剩下字符  只要一对符号不正确使用就不用再查找剩下的字符
            }
        }
        
        i++;
    }
    
    if( (LinkStack_Size(stack) == 0) && (code[i] == '\0') )//如果执行到这里栈内没有数据并全部字符检查完毕
    {
    
    
        printf("Succeed!\n");//输出成功
        ret = 1;
    }
    else
    {
    
    
        printf("Invalid code!\n");//否则输出失败
        ret = 0;
    }
    
    LinkStack_Destroy(stack);//销毁栈
    
    return ret;//返回结果
}

int main(int argc, char *argv[])
{
    
    
    const char* code = "#include <stdio.h> int main() { int a[2][5]; int (*p)[3]; p = a[0]; printf(\"%d\\n\", &p[2][3] - &a[1][3]); return 0; }";

    scanner(code);

	getchar();
	return 0;
}

分析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

汇编:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_37599645/article/details/111933246