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编译,之后链接成一个可执行文件。
有什么问题继续追问,不要一直拖到问题过期。