算法思路
當需要檢測成對出現,但不相鄰的事物時,可以使用棧“後進先出”的特性,幾乎所有的編譯器都具有檢測括號是否匹配的能力。
從第一個字符開始掃描
當遇到普通字符時忽略 當遇到左符號時壓入棧中
當遇到右符號時從棧中彈出棧頂符號並進行匹配
匹配成功:繼續讀入下一個字符
匹配失敗: 立即停止報錯。
結束:
成功:所有字符掃描完畢且棧爲空
失敗:匹配失敗或所有字符掃描完畢但棧爲非空
中間用到棧的鏈式存儲的兩個文件 見數據結構-棧的應用就近匹配(6)
// 棧的應用就近匹配.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include<string.h>
#include"LinkStack.h"
using namespace std;
void scanner(const char* code);
int isLeft(char c);
int isright(char c);
int match(char left, char right);
int main()
{
const char* code = "#include<stdio.h> int main() {int a[4][4];int (*p)[4];p=a[0];return 0; }";
scanner(code);
//system("pause");
return 0;
}
void scanner(const char* code)
{
LinkStack* stack = Stack_Create();//創建一個棧
int ret = 0, i = 0;
while (code[i] != '\0')
{
if (isLeft(code[i]))
{
Stack_Push(stack,(void*)&code[i]);//入棧
}
if (isright(code[i]))
{
char* c = (char*)Stack_Pop(stack);//出棧
if (c == NULL || !match(*c, code[i]))
{
ret = 0;
break;
}
}
i++;
}
if (Stack_Size(stack)==0&&code[i]=='\0')
{
printf("success");
ret = 1;
}
else
{
printf("fail");
ret = 0;
}
Stack_Destory(stack);
}
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;
}