练习题目
利用栈先将后出的特性,判断字符串中的数字表达式括号是否成对匹配,如果没有给出错误位置信息提示。
代码实现
代码思路很简单,如果是左括号将左括号 就入栈,遇到右括号 栈中的左括号出栈。如果该出栈的时候,栈空 肯定匹配错误。还有就是表达式遍历完毕,我们的栈 如果是全部匹配成功 ,栈肯定为空,不为空 匹配错误!这里我们使用之前写的顺序栈,不清楚的可以看:线性表:顺序栈算法实现。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "SeqStack.h"
//打印错误信息
void PrintError(char* str,char* errMsg,char* ch)
{
printf("错误信息:%s\n", errMsg);
printf("%s\n",str);
int num = ch - str;
for (int i = 0; i < num; i++)
{
printf(" ");
}
printf("^\n");
}
/*
利用栈 判断表达式中括号是否成对出现,如果没有完全匹配,打印错误信息。
*/
void BracketMatch()
{
char* dest = "1+3+2*(1-5)+5-3(+(1+3(+";
char* str = dest;
SeqStack stack = Init_SeqStack();
char* ch;
while (*str)
{
//遇到左括号,入栈
if (*str == '(')
{
Push_SeqStack(stack, str);
}
//遇到右括号,出栈进行匹配
if (*str==')')
{
if (IsEmpty_SeqStack(stack))
{
PrintError(dest, "右括号匹配失败", str);
break;
}
else
{
Pop_SeqStack(stack);
}
}
str++;
}
//遍历完毕 栈空括号表达式正确
if (IsEmpty_SeqStack(stack))
{
printf("括号表达式正确\n");
}
else
{
while (!IsEmpty_SeqStack(stack))
{
ch = Pop_SeqStack(stack);
PrintError(dest, "左括号匹配失败", ch);
}
}
return;
}
int main(int argc, char *argv[])
{
BracketMatch();
return 0;
}