3.括号匹配

假设一个算术表达式中包含圆括号、方括号两种类型的括号,试编写一个判断表达式中括号是否匹配的程序,匹配返回
Match succeed!
,否则返回Match false!

[1+2*(3+4*(5+6))]括号匹配

(1+2)*(1+2*[(1+2)+3)括号不匹配

输入

包含圆括号、方括号两种类型括号的算术表达式

输出

匹配输出Match succeed!

不匹配输出 Match false!

输入[1+2* (3+4*(5+6))]

输出Match succeed!

测试用例1: 输入:
[1+2*(3+4*(5+6))]↵ 输出:
Match succeed!↵ 测试用例2 : 输入:
(1+2)*(1+2*[(1+2)+3)↵ 输出:
Match false!↵

个人做题时出现的问题: 1.刚开始是选错了提交的编译器,因为函数参数传递时用到了&,这是C++的引用的用法,就是给参数取了个别名的意思;而&在C里面是取地址的操作,对于有几个函数需要进行参数传递时,用C++的&比用C里面的指针的操作要简便很多。 2.改正了第一个错误后,提交后部分不能通过,调试发现参数e的一直一直未0,与书上的几个函数参数引用形式比较才发现,是Pop(&S,&e)而不是Pop(&S,e).看来对个数据结构基本操作的具体形式还是要理解透记清楚。

//括号内引用问题一定要记清楚,Pop里面的参数e就是要引用操作,切记!!! 
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h> 
#define S_size 100
#define StackIncreament 10 

typedef struct SqStack
{
	int *base;
	int *top;
	int stacksize;
}SqStack;

void InitStack(SqStack &S)
{
	S.base = (int *)malloc(S_size*sizeof(int));
	if(S.base)
	S.top = S.base;
	S.stacksize = S_size;
}//InitStack

int EmptyStack(SqStack &S)
{
//	SqStack S;
	if(S.base==S.top)
	  return 1;
	else
	  return 0;
}//judge S is empty

void Push(SqStack &S,int e)
{
	//SqStack S;
//	int e;
	if((S.top-S.base)>S.stacksize)
	{
		S.base=(int *)realloc(S.base,(S.stacksize+StackIncreament)*sizeof(int));
		if(S.base) 
		S.top=S.base+S.stacksize;
		S.stacksize+=StackIncreament;
	}
	*S.top ++ = e;
}//Push

void Pop(SqStack &S,int &e)
{
//	SqStack S;
//	int e;
	if(S.top!=S.base)
	e = * --S.top;
}//Pop

int main()
{
	SqStack S;
	InitStack(S);
	char ch[100],*p;
	int e;
	p=ch;
	gets(ch);
	while(*p)
	{
		switch(*p)
			{
				case '(':Push(S,*p++);break;
				case '[':Push(S,*p++);break;
				case '{':Push(S,*p++);break;
				case ')':
					{
				         Pop(S,e);
				         if((e=='('&&*p==')')||(e=='{'&&*p=='}')||(e=='['&&*p==']'))
	   			            p++;
				         else
				            {printf("Match false!\n");exit(0);}} 
				        break;
				case ']':
					{
				         Pop(S,e);
				         if((e=='('&&*p==')')||(e=='{'&&*p=='}')||(e=='['&&*p==']'))
	   			            p++;
				         else
				            {printf("Match false!\n");exit(0);}} 
				        break;
				case '}':{
				         Pop(S,e);
				         if((e=='('&&*p==')')||(e=='{'&&*p=='}')||(e=='['&&*p==']'))
	   			            p++;
				         else
				            {printf("Match false!\n");exit(0);}} 
				        break;
				default:p++; 
			}
	}
	if(EmptyStack(S))
	  printf("Match succeed!\n");
	else
	  printf("Match false!\n");
}
    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/qq_29303759/article/details/70348634
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞