介绍
栈可以做一些有意思的应用,例如括号的匹配。在编写C程序中,编译器可以检测括号是否匹配,以及哪里匹配错误。这可以轻松的使用栈来实现。
实现
当读取到左括号的时候入栈(Push),当读取到右括号的时候,将弹出栈顶元素进行比较,检测是否是匹配的符号。如果全部匹配并且栈为空,则括号匹配,否则不匹配。
代码
代码使用数组栈,定义最大栈容量为20。
/*
字符匹配程序,利用数组栈实现。
匹配 ( [ { 这三种字符
*/
// 引入栈的头文件
#include "squenceStack.h"
#include<string.h>
// 定义最大栈长度
#define MAX 20
int main(void) {
// 创建一个栈
Stack stack;
stack = CreateStack(MAX);
char input[20];
printf("请输入一串字符,以回车结束:");
scanf("%s", input);
printf("你输入了 %s,长度为len=%d\n", input, strlen(input));
int i = 0;
for (i = 0; input[i] != '\0'; i++)
{
int iswrong = 0;
//如果是左括号,则入栈
if (input[i] == '(' || input[i] == '[' || input[i] == '{') {
Push(input[i], stack);
} else {
switch (input[i])
{
case ')':
// 如果匹配,并且出栈成功(未到栈底)
if (Top(stack) == '(' && Pop(stack) == 1)
;
// 否则出错
else
iswrong = 1;
break;
case ']':
if (Top(stack) == '[' && Pop(stack) == 1)
;
else
iswrong = 1;
break;
case '}' :
if (Top(stack) == '{' && Pop(stack) == 1)
;
else
iswrong = 1;
break;
// 其他字符则跳过
default:
break;
}
}
/* 如果任何错误发生,则退出循环 */
if (iswrong == 1) {
break;
}
}
// 如果字符读取完毕,并且栈为空,则符号匹配
if (input[i] == '\0' && IsEmpty(stack)) {
printf("符号匹配!\n");
} else {
printf("匹配错误!\n");
}
return 0;
}