思路:
设定规则,碰到左括号入栈,在这基础上,遇到右括号出栈,如一直遇不到右括号,则左括号不匹配。如果栈上没有左括号,遇到右括号,即右括号不匹配。判断栈上有没有元素的重要条件为栈的大小。即最后栈上有元素,则可以说明左括号不匹配。栈上没有元素,也不是右括号匹配的情况的话,即最后结果为括号匹配。
代码实现:
头文件.h
#pragma once
#include <iostream>
using namespace std;
//运用企业链表构建
typedef struct SNode {
struct SNode* next;
}Snode;
typedef struct LinkStack {
int size;
Snode head;//小挂钩
}Lstack;
//初始化
Lstack* init_Lstack();
//增加
void push_Lstack(Lstack* Lsta, Snode* data);
//删除
void pop_Lstack(Lstack* Lsta);
//返回栈顶元素
Snode* Top_Lstack(Lstack* Lsta);
//摧毁内存
void free_Lstack(Lstack* Lsta);
//返回栈的大小
int Size_Lstack(Lstack* Lsta);
.cpp文件
#include "Selink_stack.h"
Lstack* init_Lstack()
{
Lstack* lsta = (Lstack*)malloc(sizeof(Lstack));
lsta->size = 0;
lsta->head.next = NULL;
return lsta;
}
void push_Lstack(Lstack* Lsta, Snode* data)
{
if (Lsta == NULL) {
cout << "链表未被创建!" << endl;
}
data->next = Lsta->head.next;
Lsta->head.next = data;
Lsta->size++;
}
void pop_Lstack(Lstack* Lsta)
{
if (Lsta == NULL) {
cout << "链表未被创建!" << endl;
}
Snode* first = Lsta->head.next;
Lsta->head.next = first->next;
Lsta->size--;
}
Snode* Top_Lstack(Lstack* Lsta)
{
return Lsta->head.next;
}
void free_Lstack(Lstack* Lsta)
{
if (Lsta == NULL) {
cout << "链表未被创建!" << endl;
}
free(Lsta);
cout << "链表已被摧毁!" << endl;
}
int Size_Lstack(Lstack* Lsta)
{
return Lsta->size;
}
主函数测试文件
#include "Selink_stack.h"
typedef struct Mychar {
Snode node;
int size;
char* addr;
}mychar;
bool isLeft(char p) {
return p == '(';
}
bool isright(char p) {
return p == ')';
}
mychar* into(char *p,int index) {//即将要放入栈的左括号信息
mychar* my = (mychar*)malloc(sizeof(mychar));
my->addr = p;
my->size = index;
return my;
}
void showerror(char *str,int num) {//显示哪里出错
cout<<str<<endl;
for (int i = 0;i<num;i++) {
cout << " ";
}
cout<<"A" << endl;
}
int main() {
int index=0,pos=-1;
Lstack* lst =init_Lstack();
char str[] = "1+(2+)2+3)+(+0=";
char* p;
p = str;
//*p为单个字符
while (*p!='\0') {
//如果碰到左括号,入栈
if (isLeft(*p)) {
push_Lstack(lst,(Snode*)into(p,index));
}
//cout <<*p<<":" << lst->size << endl;
//如果碰到右括号
if (isright(*p)) {
if (lst->size > 0) {//代表有左括号 要出栈
pop_Lstack(lst);
//cout << "右"<<lst->size << endl;
pos = index;
}
else {//代表栈中无元素
showerror(str,index);
cout<<"右括号没有匹配的左括号!" << endl;
pos = 1;
}
}
index++;
p++;
}
//cout<<lst->size<<endl;
if (lst->size > 0) {
mychar* myc = (Mychar*)Top_Lstack(lst);
showerror(str,myc->size);
cout << "左括号没有匹配的右括号!" << endl;
}
if (lst->size == 0&&pos==-1) {
cout<<"括号匹配!" << endl;
}
return 0;
}