(提醒我自己:声明完指针并且要插入新节点的时候不要忘记malloc分配内存啊!)
**
主要思路:
**
声明一个链栈st,依次扫描字符表达式,如果遇到左括号‘(’则将其压入栈内,遇到右括号‘)’则先判断栈是否为空,为空则说明不配对,不为空则弹栈(因为此时栈中只有左括号,所以不需要像教材中那样判断弹出来的是否为左括号)。
扫描完字符串后判断栈是否为空,不为空则说明还有多余的左括号,不配对。
#include<iostream>
using namespace std;
#define ElemType char
typedef struct linknode // 声明链栈结构
{
ElemType data;
struct linknode *next;
}LiStack;
void InitStack(LiStack *&s)
{
s = (LiStack *)malloc(sizeof(LiStack));
s->next = NULL;
}
void Destory(LiStack *&s)
{
LiStack *p, *q;//q是p之后的指针
p = s;
q = p->next;
while (p->next != NULL)
{
free(p);
p = q;
q = q->next;
}
}
void push(LiStack *&s, ElemType e)//将新数据节点插入到头结点之后
{
LiStack *p;
p = (LiStack *)malloc(sizeof(LiStack));
p->next = s->next;
s->next = p;
p->data = e;
}
bool pop(LiStack *&s, ElemType &e)//引用类型的e保存出栈的值
{
if (s->next == NULL)
{
return false;
}
LiStack *p=s->next;
s->next = p->next;
e = p->data;
free(p);
return true;
}
//判断输入的表达式中括号是否配对
bool Match(char *exp, int n)//n代表表达式长度
{
int i = 0;
char e;
LiStack *st;
InitStack(st);
bool match = true;
while (i < n)
{
if (exp[i] == '(')
push(st, '(');
else if (exp[i] == ')')
{
if (st->next == NULL)
{
return false;
}
pop(st, e);
}
i++;//DONT FORGET I++!!!!!!
}
if (st->next != NULL)
{
match = false;
}
return match;
}
int main()
{
char *exp = "(((())(()))";
bool sss = Match(exp, 11);
if (sss)
{
cout << "true1" << endl;
}
else
cout << "false1" << endl;
system("pause");
}