用链表的方法判断括号是否匹配,我这个超时了不知道咋改


/*括号匹配
描述

给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程
检查这一串字符中的( ) ,[ ],{ }是否匹配。

输入:在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点
符号、空格。

输出:如果括号配对,输出yes,否则输出no。

用例输入 1
sin(10+20)
{[}] 

用例输出 1
yes
no 
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node
{
    char data;
    struct node *next;
}node,*linklist;

void linklist_daozhi(linklist head,int t,char a[]);//将链表倒置
int bianli(linklist head1,linklist head2);//遍历链表看倒置后是否相等

int main()
{
    int i=0,t=0,n=0,m=0;
        
    char s[110],a[110];
    node *p,*q;
    p=NULL; q=NULL;
    linklist head1,head2;
    head1=(node *)malloc(sizeof(node));
    head1->next=NULL;
    head2=(node *)malloc(sizeof(node));
    head2->next=NULL;
    p=head1;
    
    
    while(scanf("%s",s)!=EOF)
    {
        int i=0,t=0,n=0,m=0;
        
       n=strlen(s);
      p=head1;
        for(i=0;i<n;i++)
        {
           //只将输入的字符中的括号写入链表 
           if(s[i]=='('||s[i]==')'||s[i]=='['||s[i]==']'||s[i]=='{'||s[i]=='}')
          {
            a[t]=s[i]; 
            t++;//记录括号个数
            q=(node *)malloc(sizeof(node));           
            q->data=s[i];
            p->next=q;
            p=q;            
          }
          else
          continue;
         
        }
           q->next=NULL;
    
     
        linklist_daozhi(head2,t,a);
        m=bianli(head1,head2);
        if(m==1)
            printf("yes\n");
        else
            printf("no\n");
        
        
    }
    
}

void linklist_daozhi(linklist head,int t,char a[])//将链表倒置
{
    node *ptr1,*ptr2;
    int i=0;
    ptr1=head;
    while(i<=t)
    {
        ptr2=(node *)malloc(sizeof(node));
        ptr2->data=a[t];
        ptr1->next=ptr2;
        ptr1=ptr2;
        t--;
        i++;
    }
    ptr2->next=NULL;
}
int bianli(linklist head1,linklist head2)//遍历链表看倒置前后两个链表是否相等
{
    int i=0,m=0;
    head1=head1->next;
    head2=head2->next;
    while(head1!=NULL&&heads!=NULL)
    {
        i++;
        if(head1->data==head2->data)
            m++;
    }
    if(i==m)
        return 1;
    else
        return 0;
}

参考GPT和自己的思路:首先,这段代码存在几个错误:

  1. linklist_daohzi 函数中,循环应该是 while(i<t),而不是 while(i<=t);
  2. void bianli 函数中,heads 应该是 head2;
  3. bianli 函数中,需要将链表指针向后移动,即 head1=head1->next; head2=head2->next;。

此外,如果只是检查括号是否匹配,使用链表这样的数据结构可能会显得过于复杂。可以直接使用栈,利用栈的先进后出的性质来检查括号是否匹配。具体做法为:读取到左括号时,将其入栈;读取到右括号时,弹出栈顶元素,判断是否与右括号匹配。如果不匹配,则说明括号不匹配。如果最终栈中还有元素,也说明括号不匹配。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/716314
  • 这篇博客也不错, 你可以看下关于:如果函数的参数是一个指针,不要指望用该指针去申请动态内存 我的理解
  • 除此之外, 这篇博客: 操作系统之寄存器中的 说到寄存器,首先我们需要知道寄存器是什么? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 寄存器就是CPU内部用来存储数据的小型存储区域,用来暂时存放参与运算的数据以及运算的结果、一些CPU运行所需要的信息。
  • 您还可以看一下 邓俊老师的软件项目管理实战课程中的 课程及自我介绍小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    对于判断括号是否匹配的链表方式出现超时的问题,可以尝试使用栈的方式来进行优化。具体步骤如下:

    1. 定义一个栈,用来存储左括号'('。
    2. 遍历字符串中的字符,如果是左括号'('则将其入栈,如果是右括号')',则从栈中取出一个左括号匹配。
    3. 如果栈为空,或者取出的左括号与当前的右括号不匹配,则返回false。
    4. 遍历结束后,如果栈为空,则返回true,否则返回false。

    具体代码如下:

    bool isMatch(string s) {
        stack<char> stk;
    
        for (char c : s) {
            if (c == '(') {
                stk.push(c);
            }
            else if (c == ')') {
                if (stk.empty() || stk.top() != '(') {
                    return false;
                }
                stk.pop();
            }
        }
    
        return stk.empty();
    }
    

    这样的栈方式时间复杂度为O(n),可以避免链表方式的超时问题。