##1、括号匹配问题:
解决思路:
void MatchBrackets (const char* str)
{
char* per = NULL;
int i = 0;
Stack s;
assert (str != NULL);
InitStack (&s);
per = (char*)str;
for (i=0; per[i] != 0; i++)
{
if ('(' == per[i] || '[' == per[i] || '{' == per[i])
{
PushStack (&s, per[i]);//入栈
}
else if (')' == per[i] || ']' == per[i] || '}' == per[i])
{
char ch ;
if (IsEmpty (&s) == 1)//判断栈是否为空(等一为空,等零不为空)
{
printf ("右括号比左括号多!!!\n");
return ;
}
ch = TopNumAndTop (&s);//返回栈顶元素并出栈
switch (ch)
{
case '(':
if (per[i] != ')')
{
printf ("左右括号次序匹配错误!!!\n");
return ;
}
break;
case '[':
if (per[i] != ']')
{
printf ("括号不匹配!!!\n");
return ;
}
break;
case '{':
if (per[i] != '}')
{
printf ("括号不匹配!!!\n");
return ;
}
break;
}
}
}
if (IsEmpty (&s) == 1) //判断栈是否为空(等1为空,等0不为空)
{
printf ("括号匹配正确!!!\n");
}
else
{
printf ("左括号比右括号多!!\n");
}
}
测试代码:
void test_Match_Brackets() //括号匹配问题
{
char arr1[] = "(())abc{[()]}}";//右括号比左括号多
char arr2[] = "(())abc{[(])}";//左右括号次序匹配错误
char arr3[] = "(())abc{[]}"; //左右括号匹配正确
char arr4[] = "(([]))abc{{([])}"; //左括号比右括号多
MatchBrackets (arr1);
MatchBrackets (arr2);
MatchBrackets (arr3);
MatchBrackets (arr4);
}
运行结果:
###2、逆波兰表达式求值
####什么是逆波兰表达式:
逆波兰表示法也叫后缀表示法,即操作符号都置于操作数的后面,逆波兰表示法可以不用括号来标识操作符的优先级。例如:3+4 是一个中缀表达式,转换成逆波兰表达式为34+
思路:
int ReversePolishExpression (const char* str) //逆波兰表达式求值
{
Stack s;
char* arr;
int i = 0;
assert (str != NULL);
InitStack (&s);
arr = (char*)str;
while (*arr)
{
char* p1 = arr;
while (*arr != ' ' && *arr != '+' && *arr != '-' && *arr != '*' && *arr != '/')
{
arr++;
}
if (*arr == ' ' && *p1 != ' ')
{
*arr = '\0';
PushStack (&s, StrToA (p1));
}
if ((*arr == '+') || (*arr == '-') || (*arr == '*') || (*arr == '/'))
{
DataType a = TopNumAndTop (&s);
DataType b = TopNumAndTop (&s);
switch (*arr)
{
case '+':
PushStack (&s, b+a);
break;
case '-':
PushStack (&s, b-a);
break;
case '*':
PushStack (&s, b*a);
break;
case '/':
PushStack (&s, b/a);
break;
}
}
arr++;
}
return TopNumAndTop (&s);
}
测试代码:
void test_ReversePolishExpression ()//逆波兰表达式
{
char arr[] = "12 3 4 + * 6 - 8 2 / +";
printf ("%d\n", ReversePolishExpression(arr));;
}
运行结果:
注:关于本片博客里的栈的操作,可以参考上一篇博客“C语言_顺序栈的基本操作”