利用栈的特性来实现左右括号就进匹配是栈的一个典型应用。遍历字符串,配合遍历情况来进行入栈出栈操作然后判断栈内元素个数就可以完成判断,可以在遍历时记录遍历到的位置,并且给每个入栈元素记录位置,这样就可以在得出结果后指出不匹配的左右括号位置。在使用c语言完成时,用到了自己编写的栈,在使用c++编写时,直接使用STL。
main.cpp
#include<iostream>
#include<stack>
#include<string>
using namespace std;
bool isLeft(const char* p)
{
return *p == '(';
}
bool isRight(const char* p)
{
return *p == ')';
}
void PrintfError(string str, int index)
{
cout << str << endl;
for (int i = 0; i < index; i++)
{
cout << " ";
}
cout << 'A' << endl;
}
int main()
{
string str = "123(4asfjh)((fgws)";
stack<pair<const char*,int>>s;
int index = 0;
const char* p = str.c_str();
while (*p != '\0')
{
//左括号入栈
if (isLeft(p))
{
s.push(make_pair(p,index));
}
//右括号出栈
if (isRight(p))
{
if (!s.empty())
{
if (isLeft(s.top().first))
{
s.pop();
}
}
else
{
cout << "右括号没有匹配的左括号" << endl;
PrintfError(str, index);
}
}
p++;
index++;
}
while (s.size() > 0)
{
cout << "左括号没有匹配的右括号" << endl;
PrintfError(str, s.top().second);
break;
}
system("pause");
return 0;
}
main.c
#define _crt_secure_no_warnings
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "linkstack.h"
typedef struct mychar
{
LinkNode node;
char* pAddres;
int index;
}MyChar;
int IsLeft(char c)
{
return c == '(';
}
int IsRight(char c)
{
return c == ')';
}
MyChar* CreatMychar(char* p, int index)
{
MyChar* mychar = (MyChar*)malloc(sizeof(MyChar));
mychar->pAddres = p;
mychar->index = index;
return mychar;
}
void ShowError(char* str, int pos)
{
printf("%s\n", str);
for (int i = 0; i < pos; i++)
{
printf(" ");
}
printf("A");
}
int main()
{
//3+5*(7+4)+(
//扫描字符串,如果碰到左括号,直接入栈
//如果碰到右括号,从栈顶弹出括号,判断是否是左括号,如果是匹配成功。
char* str = "ojahos(jd)askd12(()";
char* p = str;
int index = 0;
//创建栈容器
LinkStack* stack = Init_LinkStack();
while (*p != '\0')
{
//如果是左括号直接进栈
//printf("*p %c ");
if (IsLeft(*p))
{
//printf("%c", *p);
Push_LinkStack(stack, (LinkNode*)CreatMychar(p,index));
}
//如果是右括号,从栈顶弹出元素,判断是不是左括号
if (IsRight(*p))
{
if (Size_LinkStack(stack) > 0)
{
MyChar* mychar = (MyChar*)Top_LinkStack(stack);
if (IsLeft(*(mychar->pAddres)))
{
Pop_LinkStack(stack);
free(mychar);
}
}
else
{
printf("右括号没有匹配的左括号:\n");
ShowError(str, index);
break;
}
}
p++;
index++;
}
while (Size_LinkStack(stack) > 0)
{
MyChar* mychar = (MyChar*)Top_LinkStack(stack);
printf("左括号没有匹配的右括号:\n");
ShowError(str, mychar->index);
Pop_LinkStack(stack);
free(mychar);
break;
}
system("pause");
return 0;
}
测试结果: