| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3312 人关注过本帖
标题:求助 括号匹配问题源代码
只看楼主 加入收藏
cy51161952
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-6-28
收藏
 问题点数:0 回复次数:4 
求助 括号匹配问题源代码

括号匹配问题<在vc++环境>
问假设一个算术表达式种可包含三种括号:
圆括号,方括号和花括号且三种括号可按任意次序嵌套使用.
试利用栈的运算编写判别给定表达中所含括号是否正确匹配对出现的算法,并能指示出错的位置.

请高手帮帮忙啊!下星期就交了.

搜索更多相关主题的帖子: 括号 源代码 环境 嵌套 
2007-07-05 23:38
guoxiaogang
Rank: 1
等 级:新手上路
威 望:1
帖 子:12
专家分:0
注 册:2007-7-3
收藏
得分:0 

typedef char SElemType;
#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等 */
#include<limits.h> /* INT_MAX等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */
#include<process.h> /* exit() */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
#define STACK_INCREMENT 2 /* 存储空间分配增量 */
typedef struct SqStack
{
SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
SElemType *top; /* 栈顶指针 */
int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack; /* 顺序栈 */
void InitStack(SqStack *S)
{ /* 构造一个空栈S */
(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW); /* 存储分配失败 */
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
}

void DestroyStack(SqStack *S)
{ /* 销毁栈S,S不再存在 */
free((*S).base);
(*S).base=NULL;
(*S).top=NULL;
(*S).stacksize=0;
}

void ClearStack(SqStack *S)
{ /* 把S置为空栈 */
(*S).top=(*S).base;
}

Status StackEmpty(SqStack S)
{ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
if(S.top==S.base)
return TRUE;
else
return FALSE;
}

int StackLength(SqStack S)
{ /* 返回S的元素个数,即栈的长度 */
return S.top-S.base;
}

Status GetTop(SqStack S,SElemType *e)
{ /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */
if(S.top>S.base)
{
*e=*(S.top-1);
return OK;
}
else
return ERROR;
}

void Push(SqStack *S,SElemType e)
{ /* 插入元素e为新的栈顶元素 */
if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空间 */
{
(*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACK_INCREMENT)*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW); /* 存储分配失败 */
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACK_INCREMENT;
}
*((*S).top)++=e;
}

Status Pop(SqStack *S,SElemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
if((*S).top==(*S).base)
return ERROR;
*e=*--(*S).top;
return OK;
}

void StackTraverse(SqStack S,void(*visit)(SElemType))
{ /* 从栈底到栈顶依次对栈中每个元素调用函数visit() */
while(S.top>S.base)
visit(*S.base++);
printf("\n");
}
void check()
{ /* 对于输入的任意一个字符串,检验括号是否配对 */
SqStack s;
SElemType ch[80],*p,e;
InitStack(&s); /* 初始化栈成功 */
printf("Please putinto your(()、[]和{})biaodashi\n");
gets(ch);
p=ch; /* p指向字符串的首字符 */
while(*p) /* 没到串尾 */
switch(*p)
{
case '(':
case '[':
case '{':Push(&s,*p++); /* 左括号入栈,且p++ */
break;
case ')':
case ']':
case '}':if(!StackEmpty(s)) /* 栈不空 */
{
Pop(&s,&e); /* 弹出栈顶元素 */
if(!(e=='('&&*p==')'||e=='['&&*p==']'||e=='{'&&*p=='}'))
{ /* 出现3种匹配情况之外的情况 */
printf("left kuohao!=right\n");
exit(ERROR);
}
}
else /* 栈空 */
{
printf("lose left's kuohao\n");
exit(ERROR);
}
default: p++; /* 其它字符不处理,指针向后移 */
}
if(StackEmpty(s)) /* 字符串结束时栈空 */
printf("right!\n");
else
printf("Sorry,it's wrong!\n");
}

void main()
{
check();
}

2007-07-06 14:51
mjh_abc
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2007-7-7
收藏
得分:0 
ai,这简单的东西也要别人编
2007-07-07 08:31
cy51161952
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-6-28
收藏
得分:0 

有没有用vc++做的?
我急啊!


2007-07-08 22:56
guoxiaogang
Rank: 1
等 级:新手上路
威 望:1
帖 子:12
专家分:0
注 册:2007-7-3
收藏
得分:0 
对不起啊,我只学了C语言.不会C++,我想只是细节上的问题.你改一下.
2007-08-15 23:28
快速回复:求助 括号匹配问题源代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023570 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved