數據結構-棧的應用就近匹配(7)

算法思路
當需要檢測成對出現,但不相鄰的事物時,可以使用棧“後進先出”的特性,幾乎所有的編譯器都具有檢測括號是否匹配的能力。
從第一個字符開始掃描
     當遇到普通字符時忽略
    當遇到左符號時壓入棧中
    當遇到右符號時從棧中彈出棧頂符號並進行匹配
           匹配成功:繼續讀入下一個字符
           匹配失敗: 立即停止報錯。
結束:
成功:所有字符掃描完畢且棧爲空
失敗:匹配失敗或所有字符掃描完畢但棧爲非空

中間用到棧的鏈式存儲的兩個文件 見數據結構-棧的應用就近匹配(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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章