数据结构 栈的应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 栈的应用相关的知识,希望对你有一定的参考价值。

题目描述

请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。

输入

有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。

输出

对每个表达式,若其中的括号是匹配的,则输出”yes”,否则输出”no”。

样例输入

4
[(d+f)*{}]
[(2+3))
()}
[4(6]7)9

样例输出

yes
no
no
no
解题思路:
    加入括号一一配对,则()[] {}左右符号一一对应,也就是说在字符串中间必有一左一右括号相连并且两者对应,说先应该去掉除括号以外的其他字符,然后运用栈依次将左括号存入栈中,遇到右括号时间与栈底符号比较,匹配时间栈的标记元素减一。直到最后若栈的标记元素等零,说明栈中的括号一一匹配。
 
代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct stu{
char s[1010];
int head;
int tail;
}st;
int funz(char s)
{
if(s==‘(‘)
return 1;
else if(s==‘[‘)
 return 2;
else if(s==‘{‘)
 return 3;
else
 return -1;
}
int funy(char s)
{
if(s==‘)‘)
return 1;
    else if(s==‘]‘)
    return 2;
    else if(s==‘}‘)
     return 3;
     else
     return 0;
}
int main()
{
int i,m,n;
st s1;
char s0;
char s[1010];
scanf("%d",&m);
getchar();
while(m--)
{
  s1.head=s1.tail=0;
  i=0;
  while(scanf("%c",&s0),s0!=‘\n‘)
   if(s0==‘(‘||s0==‘)‘||s0==‘[‘||s0==‘]‘||s0==‘{‘||s0==‘}‘)
     s[i++]=s0;
     s[i]=‘\0‘;
     if(strlen(s)%2!=0)
     {
      printf("no\n");
      continue;
 }
       for(i=0;s[i]!=‘\0‘;i++)
       {
         if(s[i]==‘(‘||s[i]==‘[‘||s[i]==‘{‘)
            s1.s[s1.tail++]=s[i];
         else if(s[i]==‘)‘||s[i]==‘]‘||s[i]==‘}‘)
             {
              if(funz(s1.s[s1.tail-1])==funy(s[i]))
                s1.tail--;
}
  }
  if(s1.tail==0)
   printf("yes\n");
  else
   printf("no\n");
}
return 0;
}

以上是关于数据结构 栈的应用的主要内容,如果未能解决你的问题,请参考以下文章

算法与数据结构--栈的应用-逆波兰计算器完整版代码

C/C++语言数据结构快速入门(代码解析+内容解析)栈的应用

Android Studio - 带回栈的导航抽屉

数据结构&算法08-栈概念&源码

栈的应用(Boolan)

C/C++迷宫问题详情分析--栈的应用