借鉴于MOOC西北大学数据结构视频参考
typedef struct Stack
{
char ch;
Stack* next;
}Stack,*PStack;
单向链式存储结构
void PushStack(PStack stack, char* str) //左括号入栈
{
PStack Top = new Stack;
Top->ch = *str;
Top->next = stack->next;
stack->next = Top;
}
bool PopStack(PStack stack, char* str)//左括号出栈
{
if (!stack->next)
return false;
PStack Top = stack->next;
stack->next = Top->next;
*str = Top->ch;
delete Top;
return true;
}
非常简单的出入栈操作 这里就说下进栈操作不用加判栈满操作是因为 毕竟是绳不是杯 只要内存有空间就能进栈 所以不加判满
bool GetStackTop(const PStack stack, char* str)//取栈顶操作
{
if (!stack->next)//栈空时返回false
return false;
*str = stack->next->ch;
return true;
}
bool VeriyOp(const char *str1,const char*str2)//检验括号是否匹配
{
switch (*str1)
{
case ‘(‘:
if ((*str2) == ‘)’) return true;
else return false;
case ‘{‘:
if ((*str2) == ‘}’) return true;
else return false;
case ‘[‘:
if ((*str2) == ‘]’) return true;
else return false;
}
}
检验栈顶括号是否与检测括号匹配 *str1栈顶左括号,*str2是待检测的右括号 成功匹配返回真
下面就是主要解决过程
首先判断括号数是否是奇数,奇数情况直接返回错误,终止。
否则,依次取括号判断入栈、匹配。
bool OperatorS(char * str)//括号匹配solution
{
char Topch;
int i = 0; //判断括号个数
PStack a = new Stack;
InitStack(a);
for (i = 0; *(str + i) != ‘\0’; ++i)
{ }//累计计算括号个数
if (*(str + i) == ‘\0’&&i % 2)//括号个数若为奇数 直接返回 不入栈
{
cout << “括号匹配错误,个数为” << i << “个” << endl;
return false;
}
for (i = 0; *(str + i) != ‘\0’; ++i)
{
switch (*(str + i))
{
case ‘{‘:
case ‘[‘:
case ‘(‘:
PushStack(a, str + i);//左括号入栈
break;
case ‘}’:
case ‘]’:
case ‘)’:
if (!PopStack(a, &Topch)|!VeriyOp(&Topch, str + i))//检验括号是否匹配操作,其中两个判断条件位置顺序不可交换
{
cout << *(str+i)<<“括号匹配错误” << endl;
return false;
}
break;
default:
break;
}
}
return true;
}
typedef struct Stack
{
char ch;
Stack* next;
}Stack,*PStack;
void InitStack(PStack stack)//初始化
{
stack->ch = NULL;
stack->next = NULL;
}
void PushStack(PStack stack, char* str) //左括号入栈
{
PStack Top = new Stack;
Top->ch = *str;
Top->next = stack->next;
stack->next = Top;
}
bool PopStack(PStack stack, char* str)//左括号出栈
{
if (!stack->next)
return false;
PStack Top = stack->next;
stack->next = Top->next;
*str = Top->ch;
delete Top;
return true;
}
bool GetStackTop(const PStack stack, char* str)//取栈顶操作
{
if (!stack->next)//栈空时返回false
return false;
*str = stack->next->ch;
return true;
}
bool VeriyOp(const char *str1,const char*str2)//检验括号是否匹配
{
switch (*str1)
{
case '(':
if ((*str2) == ')') return true;
else return false;
case '{':
if ((*str2) == '}') return true;
else return false;
case '[':
if ((*str2) == ']') return true;
else return false;
}
}
bool OperatorS(char * str)//括号匹配solution
{
char Topch;
int i = 0; //判断括号个数
PStack a = new Stack;
InitStack(a);
for (i = 0; *(str + i) != '\0'; ++i)
{ }//累计计算括号个数
if (*(str + i) == '\0'&&i % 2)//括号个数若为奇数 直接返回 不入栈
{
cout << "括号匹配错误,个数为" << i << "个" << endl;
return false;
}
for (i = 0; *(str + i) != '\0'; ++i)
{
switch (*(str + i))
{
case '{':
case '[':
case '(':
PushStack(a, str + i);//左括号入栈
break;
case '}':
case ']':
case ')':
if (!PopStack(a, &Topch)|!VeriyOp(&Topch, str + i))//检验括号是否匹配操作,其中两个判断条件位置顺序不可交换
{
cout << *(str+i)<<"括号匹配错误" << endl;
return false;
}
break;
default:
break;
}
}
return true;
}