您的位置:首页 > 其它

利用之前的链式栈实现左右符号匹配检测

2014-05-08 23:37 225 查看
哈哈哈

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int Is_Left(char c)
{
int ret = 0;
switch(c){
case '(':
case '{':
case '[':
case '<':
case '\'':
case '\"':
ret = 1;
break;
default:
ret = 0;
break;
}
return ret;
}
int Is_Right(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 Scan(const char* str)
{
int ret = 0;
LinkStack* stack = LinkStack_Create();
int i =0;

while(str[i] != '\0'){
if(Is_Left(str[i])){
LinkStack_Push(stack,(void*)(str + i));
}else if(Is_Right(str[i])){//这里要改成else if,对每一个字符他每次都只判断一次。否则如果遇到单引号或者双引号只出现一个的时候,他也会判断成匹配成功
char* c = (char*)LinkStack_Pop(stack);
if((c == NULL) || (!match(*c,str[i]))){
printf("%c does not match!\n",str[i]);
ret = 0;
break;
}
}
i++;
}

if((LinkStack_Size(stack) == 0) && (str[i] == '\0')){
printf("Succed!!\n");
ret = 1;
}else{
printf("Failed!!\n");
ret = 0;
}
LinkStack_Destroy(stack);
return ret;
}

int main(int argc, char *argv[])
{

const char* code = "{}\'[]{}";

Scan(code);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: