1. 首页 > 科技

c++题目“括号匹配”求助!急!(请大神用C语言解决括号匹配问题)

c++题目“括号匹配”求助!急!(请大神用C语言解决括号匹配问题)

请大神用C语言解决括号匹配问题

int main()

{

int i, j, k = 0, p, N, mark[256];

char s[256];

scanf("%d", &N);

for(i=0; i<N; i++)

{

scanf("%s", s);

for(j=0,p=0; s[j]; j++)

{

if(s[j]=='(')++p;

if(s[j]==')')--p;

if(p<0)break;

}

mark[k++] = s[j]=='\0' && p==0;

}

for(i=0; i<k; i++)

printf("%d\n", mark[i]);

}

C语言括号匹配问题

//我想说修改的是注释后面带问号的

//有错误你挨个调就行,错误后面会提示哪错,你就具体的看那条语句附近就行

#include <stdio.h>

#include<stdlib.h>//??????exit需要头文件

typedef struct

{

char data[20];//?????????data,不是sata

int top;

int base;//??????????符号

}seqstack;

void InitStack(seqstack *s);   /* 初始化栈*/

int Empty(seqstack *s);          /* 判断栈是否为空*/

void Push(seqstack *s, char x);   /*压栈*/

char Pop(seqstack *s);        /*弹栈 */ 

int MatchingCheck(void);     /*匹配测试*/

void InitStack(seqstack *s)//初始化栈

{

s->top=0;

s->base=0;

}

int Empty(seqstack*s)

{

if(s->top==s->base==0)

return 1;

else

return 0;

}

void Push(seqstack*s,char x)

{

if(s->top==20)//?????if只能接一个语句,加上{}

printf("overflow\n");

exit(0);//?

}

else 

{    s->data[s->top] = x;

s->top++;

}     

}    /* 进栈 */ 

char Pop(seqstack *s)

{    

char e;

if(Empty(s))

{   printf("Under flow!\n");

exit(0);

}   /* 下溢*/

else 

s->top--;

e = s->data[s->top];

return e;

}

} /* 出栈*/

int MatchingCheck(void)

{

seqstack s;

char ch;

InitStack(&s);

ch=getchar();

while(ch!='#')

{

if(ch=='['||ch=='(')//若为左括号

Push(&s,ch);

if(ch==']'||ch==')')//若为右括号

{

if (Empty(&s))//???????????把Empty(&s)括起来

{

return 0;

}

else if((ch==']' && s.data[s.top-1]=='[') || (ch==')' && s.data[s.top-1]=='('))//若不空则比较栈顶元素,匹配则弹栈一次*/ 

Pop(&s);//&s?

else

return 0;

}

ch=getchar();

}

if( Empty(&s))//???????????把Empty(&s)括起来

return 1;

else

return 0;

}//????????????少match的右半括号

int mian()

{

if(1)//?????????????while改成if

printf("Match succeed!\n");

else

printf("Match false!");

return 0;

}

求C语言括号配对问题答案

头文件:(另存为SeqStack.h)

typedef struct

{

DataType stack[MaxStackSize];

int top;

} SeqStack;

void StackInitiate(SeqStack *S) /*初始化顺序堆栈S*/

{

S->top = 0; /*定义初始栈顶下标值*/

}

int StackNotEmpty(SeqStack S)

/*判顺序堆栈S非空否,非空则返回1,否则返回0*/

{

if(S.top <= 0) return 0;

else return 1;

}

int StackPush(SeqStack *S, DataType x)

/*把数据元素值x压入顺序堆栈S,入栈成功则返回1,否则返回0 */

{

if(S->top >= MaxStackSize)

{

printf("堆栈已满无法插入! \n");

return 0;

}

else

{

S->stack[S->top] = x;

S->top ++;

return 1;

}

}

int StackPop(SeqStack *S, DataType *d)

/*弹出顺序堆栈S的栈顶数据元素值到参数d ,出栈成功则返回1,否则返回0*/

{

if(S->top <= 0)

{

printf("堆栈已空无数据元素出栈! \n");

return 0;

}

else

{

S->top --;

*d = S->stack[S->top];

return 1;

}

}

int StackTop(SeqStack S, DataType *d)

/*取顺序堆栈S的当前栈顶数据元素值到参数d ,成功则返回1,否则返回0*/

{

if(S.top <= 0)

{

printf("堆栈已空! \n");

return 0;

}

else

{

*d = S.stack[S.top - 1];

return 1;

}

}

括号问题

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#define MaxStackSize 100

typedef char DataType;

#include "SeqStack.h"

void ExpIsCorrect(char exp[], int n)

//判断有n个字符的字符串exp左右括号是否配对正确

{

SeqStack myStack; //定义链式堆栈

int i;

char c;

StackInitiate(&myStack);

for(i = 0; i < n; i++)

{

if((exp[i] == '(') || (exp[i] == '[') || (exp[i] == '{'))

StackPush(&myStack, exp[i]); //入栈

else if(exp[i] == ')' && StackNotEmpty(myStack)

&& StackTop(myStack, &c) && c == '(')

StackPop(&myStack, &c); //出栈

else if(exp[i] == ')' && StackNotEmpty(myStack)

&& StackTop(myStack, &c) && c != '(')

{

printf("左右括号配对次序不正确!\n");

return;

}

else if(exp[i] == ']' && StackNotEmpty(myStack)

&& StackTop(myStack, &c) && c == '[')

StackPop(&myStack, &c); //出栈

else if(exp[i] == ']' && StackNotEmpty(myStack)

&& StackTop(myStack, &c) && c != '[')

{

printf("左右括号配对次序不正确!\n");

return;

}

else if(exp[i] == '}' && StackNotEmpty(myStack)

&& StackTop(myStack, &c) && c == '{')

StackPop(&myStack, &c); //出栈

else if(exp[i] == '}' && StackNotEmpty(myStack)

&& StackTop(myStack, &c) && c != '{')

{

printf("左右括号配对次序不正确!\n");

return;

}

else if(((exp[i] == ')') || (exp[i] == ']') || (exp[i] == '}'))

&& !StackNotEmpty(myStack))

{

printf("右括号多于左括号!\n");

return;

}

}

if(StackNotEmpty(myStack))

printf("左括号多于右括号!\n");

else

printf("左右括号匹配正确!\n");

}

void main(void)

{

char a[] = "(())abc{[)(]}"; //测试例子1。左右括号配对次序不正确

char b[] = "(()))abc{[]}"; //测试例子2。右括号多于左括号

char c[] = "(()()abc{[]}"; //测试例子3。左括号多于右括号

char d[] = "(())abc{[]}"; //测试例子4。左右括号匹配正确

int n1 = strlen(a);

int n2 = strlen(b);

int n3 = strlen(c);

int n4 = strlen(d);

ExpIsCorrect(a, n1);

ExpIsCorrect(b, n2);

ExpIsCorrect(c, n3);

ExpIsCorrect(d, n4);

}

二者放于同一目录下即可

C语言 括号匹配问题 帮忙看看哪里有问题 谢谢

5分??

未免也太少了吧?

你这代码问题也不少:

1,函数声明与函数的定义不一致,声明的函数是int型返回值,而定义的却是void型返回值。

2,结构体名称写错,使用的结构体的名称不是定义的结构体的名称。

3,调用函数时,函数名写错,不是你定义的那个函数的名称。

4,函数的参数类型与你调用函数时传入的参数类型不一致,函数支持的参数是字符串类型,你传的却是单字符类型。

5,把变量名当成字符串用,变量名两边加上单引号就不是那个变量了,而是一个字符常量。

6,用#include去包含cpp文件,虽然是可以,但不推荐这样用,应该新建一个h文件,把函数的声明以及#define宏定义写进去,之后,#include "你的头文件.h"即可。

7,代码编写风格不怎么好,虽然不是大问题,但影响代码的可读性,建议格式化代码。

花费了这么多时间为你修改/调试代码,不采纳答案那还真对不起我了。

以下内容,请看完,建议复制粘贴到代码编辑器里,重新格式化代码,方便阅读。

假设头文件为: Stack_Sq.h

那么,它的内容应该为:

//宏定义 

#define TRUE        1

#define FALSE       0

#define OK          1

#define ERROR       0

#define Stack_Size 50

typedef char StackElementType;

//定义结构体 

typedef struct            // 顺序栈

  StackElementType   elem[Stack_Size]; // 用来存放栈中元素的一维数组

  int top;              // 用来存放栈顶元素的下标,top为-1表示空栈

}

SeqStack;

//以下声明函数原型 

void InitStack(SeqStack *S);

int IsEmpty(SeqStack *S);

int IsFull(SeqStack *S);

int Push(SeqStack *S, StackElementType x);

int Pop(SeqStack *S, StackElementType *x);

int GetTop(SeqStack *S,StackElementType *x);

int ClearStack(SeqStack *S);

头文件写好了,之后在Stack_Sq.cpp中写上以下内容: 

#include "Stack_Sq.h" //包含头文件,使用头文件中的宏定义以及结构体的定义 

void InitStack(SeqStack *S)

{ // 将S初始化为一个空栈

   S->top = -1;

}

int IsEmpty(SeqStack *S)

{   // 判断栈S是否为空栈,是返回TRUE,否则返回FALSE 

  return(S->top==-1 ? TRUE : FALSE);

}

int IsFull(SeqStack *S)

{   // 判断栈S是否已满,是返回TRUE,否则返回FALSE 

   return(S->top==Stack_Size-1 ? TRUE : FALSE);

}

int Push(SeqStack *S, StackElementType x)

{   // 将数据元素x进栈S

 if (S->top==Stack_Size-1)  return(FALSE);  // 栈已满

 S->top++;

 S->elem[S->top] = x;

 return(TRUE);

}

int Pop(SeqStack *S, StackElementType *x)

{   // 将栈S的栈顶元素出栈,放到x中

 if (S->top==-1) return(FALSE);  // 栈为空

 *x = S->elem[S->top];

 S->top--;                       // 修改栈顶指针

 return(TRUE);

}

int GetTop(SeqStack *S,StackElementType *x)

{   // 取栈S的栈顶元素,放到x中

 if (S->top==-1) return(FALSE);  // 栈为空

 *x = S->elem[S->top];

 return(TRUE);

}

int ClearStack(SeqStack *S)

{   //将栈S制成空栈 

    S->top = -1; 

    return(TRUE);

}

最后,在你的main.cpp中写上以下内容:

 

#include <stdio.h>

#include <stdlib.h>

#include "Stack_Sq.h" //包含头文件,使用头文件中的宏定义以及结构体的定义 

int BracketMatch(char *str);

//错误:BracketMatch函数的声明和调用都是int型的返回值,而定义却是void型的 

int March(char ch,char str[]);

int main()

  char str[100];

  printf("Please input a string:");  gets(str);

  //BracketMatch()函数需要有返回值,不能用void,不然怎么根据返回值来判断括号是否匹配??? 

  //当BracketMatch()函数返回值为1时,也就是是为“真”,显示的字符串为:"括号匹配"

  // 当BracketMatch()函数返回值为0时,也就是是为“假”,显示的字符串为:"括号不匹配"

  printf("%s\n", BracketMatch(str) ? "括号匹配" : "括号不匹配");

  getchar();  

  getchar();

  return 1;

}

//int March(char ch,char str[])

//{   //判断两个括号是否匹配 

   //错误:if ('ch'-'str[i]'==1||'ch'-'str[i]'==-1||'ch'-'str[i]'==2||'ch'-'str[i]'==-2)

   //你这变量名加单引号就不是变量名了,而是一个字符常量的内容,一个字符用单引号,字符串就用双引号

   // 改正后为:

   //if (ch - str[i] ==1 || ch - str[i] == -1 || ch - str[i] == 2 || ch - str[i] == -2)

   //   return 1;

   //还有,你这个变量i从哪里来的?在哪里定义的?

   //else return 0; 

//}

//以下是重新修改后的March函数: 

int March(char ch1,char ch2)

{   //判断两个括号是否匹配  

   if (ch1 - ch2 == 1 || ch1 - ch2 == -1 || ch1 - ch2 == 2 || ch1 - ch2 == -2)

      return 1; 

   else return 0; 

}

//void BracketMatch(char *str) 声明的是int型,你这定义却是void型的,不统一!

//改正后为:

int BracketMatch(char *str)  

{

    //错误:Stack S;

    //Stack类型你定义了吗? 唯一定义的是SeqStack结构体。

    //改正后为:

    SeqStack S; 

    int i; 

    char ch;

    InitStack(&S);

    for(i=0;str[i]!='\0';i++)

    {

        switch(str[i])

        {

            case'(':

            case'[':

            case'{':

                Push(&S,str[i]);

                break;

            case')':

            case']':

            case'}':

                if(IsEmpty(&S))

                  { 

                      printf("\n右括号多余!");

                      return 0;

                 }

                else

                {

                      GetTop(&S,&ch);

                      //错误:if(Match(ch,str[i]))

                     //有Match()函数吗?没定义,你定义的是 March函数,名字写错了

                     //改正后为:

                      if(March(ch, str[i])) 

                      //但是,参数有问题,str[i]指的是字符串变量str中第i个元素,而这个元素只保存单个字符,不能保存字符串 

                         Pop(&S,&ch);

                      else

                      {

                         printf("\n对应的左右括号不同类!");

                         return 0;//返回0,表示“假” 

                      } 

                  }

            }

    }

    if(IsEmpty(&S))

   {

      printf("\n括号匹配!");

      return 1;//返回1,表示“真” 

   }

    else 

   {

      printf("\n左括号多余!");

      return 0;

   }

}

编译时,将main.cpp和Stack_Sq.cpp编译,之后链接成一个可执行文件。

有什么问题继续追问,不要一直拖到问题过期。