简单干脆直奔主题:
代码实现的功能就是对括号的匹配工作,原理就是利用了栈的基本性质,先让“(” “{” “[” 进入栈,当不是以上三个括号时,弹出栈顶符号判断是否与当前符合匹配;
注意:
在本此代码中引用了字符串的相关概念,有兴趣的同学可以网上查找相关理论。eg:用指针变量存储字符串;
/*
括号匹配问题;(栈)
*/
#include <stdio.h> //引用 输入(scanf)、输出(printf)函数的头文件;
#include <stdlib.h> //引用 malloc free函数的头文件;
//定义栈的结构;
typedef struct LinkNode{
char data; //存放数据元素;
LinkNode *next; //指针域;
}LinkNode, *LinkStack;
//初始化栈;
void InitStack(LinkStack &S)
{
S = NULL;
}
//判断栈空;
bool EmptyStack(LinkStack S)
{
if (S == NULL)
return true;
else
return false;
}
//新增元素:入栈;-->单链表的前插操作;
void InsertStack(LinkStack &S,char str)
{
LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode));
//printf("input what you want to insert:");
//scanf("%s",p->data);
p->data = str;
//strcpy(p->data,str);
p->next = S;
S = p;
}
//删除元素:出栈;
bool DeleteStack(LinkStack &S,char &elem){
if (EmptyStack(S)) //栈空报错;
return false;
LinkNode *p = S; //定义要删除的结点;
//printf("the Elem is Deleted: %s",p->data);
elem = p->data;
S = p->next;
free(p);
return true;
}
int main() {
//首先初始化栈;
printf("The main function is:\n");
printf("栈的应用----括号的匹配(英文状态)\n");
LinkStack S;
InitStack(S); //初始化栈;
//定义一个指针变量,存放字符串数组的首地址;
char *str = (char *)malloc(sizeof(char));
printf("input a string:");
scanf("%s",str);
//循环判断元素是否为空;
while(*str){
//有*,输出指针所指内容;没有*,输出10进制地址所对应的字符;
//printf("%c",*str);
if (*str == '(' or *str == '[' or *str == '{')
InsertStack(S,*str); //将左括号在内的元素进栈;
else{
if (EmptyStack(S)) //栈中没有左括号,匹配失败;
{
printf("There is not '(' or '[' or '{' ");
return 1;
}
char elem; //定义一个字符串,记录当前要出栈的元素;
DeleteStack(S,elem); //栈顶元素出栈;
//分别判断出栈元素与当前符号是否匹配;
if (elem != '(' and *str == ')')
{
printf("Matching failed('(')!");
return 0;
}
if (elem != '[' and *str == ']')
{
printf("Matching failed('[')!");
return 0;
}
if (elem != '{' and *str == '}')
{
printf("Matching failed('{')!");
return 0;
}
}
*str++; //指针加1;指向下一个元素;
}
if (!EmptyStack(S)) //若此时栈中还有元素,则匹配失败;
{
printf("Matching failed!");
return 1;
}
printf("Successful!!!");
return 0;
}
写在最后面:
代码如有不足之处,留言相互学习