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");
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值