Stack application_Check whether paired symbols are used correctly (code, analysis, assembly)

table of Contents:

Code:

LinkList.h
LinkList.c
LinkStack.h
LinkStack.c
stack-linear table

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;
}

analysis:

Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here

compilation:

Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here
Insert picture description here

Guess you like

Origin blog.csdn.net/m0_37599645/article/details/111933246