测试的字符串:
- 5+5*(6)+9/3*1)-(1+3(
算法思路:
从第一个字符开始扫描
当遇见普通字符时忽略
当遇见左括号时压入栈中
当遇见右括号时从栈中弹出栈顶符号,并进行匹配
匹配成功:继续进入下一个字符
匹配失败:立即停止,并报错
结束;
成功:所有字符扫描完毕,且栈为空
失败:匹配失败或所有字符扫描完毕但栈非空
#include "stack.h"
void error_show(char* str, char* p) {
int num = p - str;
for (int i = 0; i < num; i++) {
printf(" ");
}
printf("|\n");
}
void test()
{
seqStack myStack = init_SStack();
char* str = "5+5*(6)+9/3*1)-(1+3(";
printf("%s\n", str);
char* p1 = str;
while (*p1 != '\0')
{
if (*p1 == '(')
{
push_Stack(myStack,p1);
}
if (*p1 == ')')
{
if (!isEmpty_SStack(myStack))
{
pop_SStack(myStack);
}
else {
error_show(str,p1);
//break;
}
}
p1++;
}
//如果栈中还有数据 那就是 还有左括号没有匹配上
while(size_SStack(myStack) > 0) {
error_show(str, get_topValue(myStack));
pop_SStack(myStack);
}
destroy_SStack(myStack);
myStack = NULL;
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}