括号匹配问题源代码(C语言)
C语言之符号匹配
}
default: p++; //其它字符不处理,指针向后移
}
if(StackEmpty(s)) //字符串结束时栈空
printf("matching\n");
else
printf("lack of right parenthesis\n");
}
return OK;
}
int main()
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
{
return ERROR;
}
S.top = S.base+S.stacksize;
int stacksize; //当前已分配的存储空间,以元素为单位
}; //顺序栈
Status InitStack(SqStack &S)
{
S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
{
return ERROR;
{
Gettop(s,e);
if(*p==')'&&e!='('||*p==']'&&e!='[')
{
printf("isn't matched pairs\n");
C语言 检验括号匹配
先按顺序取出所有的括号.然后循环删除_相邻的_差为一或二的_点.最后如果表空则匹配.单向链表:#include <stdio.h>#include <string.h>#include <stdlib.h>#define LEN 80typedef struct list{char node;struct list* next;}list,*plist;void iniList(plist);int isEmpty(plist);int listAppend(plist,char);int delBracketsFormList(plist);int main(int argc,char* argv[]){char test[LEN];int i;list a;plist p;p=&a;iniList(p);scanf("%80s",test);for (i=0;i<LEN;i++){switch(test[i]){case '[': case']': case'{': case'}': case'(': case')':listAppend(p,test[i]);break;default:continue;}}delBracketsFormList(p);if (isEmpty(p)){printf("括号匹配!\n");}elseprintf("括号不配对!\n");return 0;}void iniList(plist aplist){aplist->next=NULL;aplist->node='\0';}int isEmpty(plist aplist){return aplist->next==NULL?1:0; }int listAppend(plist aplist,char a){ plist bplist=aplist,anode;while (bplist->next){bplist=bplist->next;}anode=(plist)malloc(sizeof(list));if (!anode)exit(-1);anode->node=a;anode->next=NULL;bplist->next=anode;return 0;}int delBracketsFormList(plist aplist){plist temp;int has=1;if (isEmpty(aplist))return 0;while(has){has=0;temp=aplist;while (temp->next){if(temp->next->next){if((temp->next->next->node - temp->next->node == 1)||(temp->next->next->node - temp->next->node == 2)){temp->next = temp->next->next->next;has=1;}elsetemp = temp->next;}elsetemp =temp->next;if(!has)break;}}return 0; }。
括号匹配性检测C语言实现
括号匹配性检测C语⾔实现#include <stdio.h>#define SIMPLE_KUOHAO "(()1231qeqw)(@#$)"#define COMPLEX_KUOHAO "{(()[asd])}{{{{(((())))}}}}"int main(int argc, const char * argv[]){/*问题描述:假设⼀个算术表达式中可以包含三种括号:圆括号"(" 和")",⽅括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使⽤(如:…[…{…}…[…]…]…[…]…(…)…)。
编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存⼊数据元素为字符的顺序表中)。
思路分析:检验括号是否匹配的⽅法可以⽤“期待的急迫程度”这个概念来描述。
例如,考虑下列括号序列: [ ( [ ] [ ] ) ] 1 2 3 4 5 6 7 8 当计算机接受了第⼀个括号后,它期待着与其匹配的第⼋个括号的出现,然⽽等来的却是第⼆个括号,此时第⼀个括号“[”只能暂时靠边,⽽迫切等待与第⼆个括号相匹配的、第七个括号“)”的出现,类似地,因等来的是第三个括号“[”,其期待匹配的程度较第⼆个括号更急迫,则第⼆个括号也只能靠边,让位于第三个括号,显然第⼆个括号的期待急迫性⾼于第⼀个括号;在接受了第四个括号之后,第三个括号的期待得到满⾜,消解之后,第⼆个括号的期待匹配就成为当前最急迫的任务了,……依此类推。
很显然,这样的⼀个处理过程和栈的特点⾮常吻合,因此,这个问题可以⽤栈来解决。
解决思路: 1.在算法中设置⼀个栈,每次读⼊⼀个括号; 2.若是右括号,则或者使置于栈顶的最急迫的期待得以消解,此时将栈顶的左括号弹出;或者是不合法的情况,此时将右括号压⼊; 3.若是左括号,则作为⼀个新的更急迫的期待压⼊栈中,⾃然使原有的在栈中的所有未消解的期待的急迫性都降低⼀级; 4.在算法的开始和结束时,栈应该为空。
C语言-括号匹配的检验
实现代码
/* **实验题二 **括号匹配的检验 **ASORB&201810 */ #include"DataH.h" int _pei(char c){ //返回匹配值 switch (c){ case '[':return 1; case ']':return 2; case '(':return 3; case ')':return 4; } } int main(){ char c; SElemType e; SqStack S; InitStack(&S); //初始化 while ((c = getchar()) != '\n'){
效#39; || c == '[') Push(&S, _pei(c)); else if (c == ')'||c == ']'){ if (Pop(&S, &e)){ if (e + 1 != _pei(c)) {
c = NULL; break; } } else{ c = NULL; break; } } } if (!StackEmpty(S))c = NULL; if (c) printf("匹配!\n"); else printf("此串括号不匹配!\n"); DestroyStack(&S); //销毁 fflush(stdin); //防闪 getchar(); return 0; }
C语言-括号匹配的检验
问题描述
假设表达式中允许有两种括号:圆括号和方括号,其嵌套的顺序随意,即(()[ ])或[([ ] [ ])]等为正确格式,[( ])或(((]均为不正确的格式。检验括号 是否匹配的方法可用“期待的紧迫程度”这个概念来描述。例如:考虑下列的括号序列: [ ( [ ] [ ] ) ] 1 2 3 4 5 6 7 8 基本要求:
C 语言实现 括号匹配 算法实例
s->StackSize+=10;
s->top=s->base+s->StackSize;
}
*(s->top)=e;
s->top++;
return OK;
}
int Pop (sqstack *s,SElemType *e){
int i,k=0;
for(i=0;i<n;i++)
if(a[i].lc==b){
k=i+1;break;
}
return (k);
}
int bdunrc(bracket *a,char b,int n){/* 判断字符b是不是a的右括号*/
printf("plase input array number:");
scanf("%d",&n);
array=(bracket *)malloc(n*sizeof(bracket));
for(i=0;i<n;i++){
flag=1;
printf("plese input the %dth couple of array:",i+1);
printf("\n");
s->base=(SElemType *)malloc(n*sizeof(SElemType));
if(!s->base) return error;
s->top=s->base;
s->StackSize=n;
数据结构(链表 括号匹配 二叉树 图)C语言源代码
InsertList() {
int i,j; struct NLode *p,*q; q=head;
} }//插入函数 void DeletList() {
int i,n; struct NLode *p,*q; p=head; printf("请输入所需删除的位置:\n"); scanf("%d",&n); if(n>mount||n<0) printf("输入的位置错误\n"); else for(i=1;i<n;i++) p=p->next; q=p->next; p->next=p->next->next; mount--; free(q); }//删除元素函数
int flag; scanf("%d",&flag);
p=(struct NLode*)malloc(LEN); p->next=NULL; last->next=p; last=p; p->data=flag; mount++; }//创建链表 FreeList() { int i; for(i=1;i<=mount;i++) {
printf("
打印请按6\n");
printf("
退出请按0\n");
数据结构实验——括号匹配的检验(附程序).
#include<stdio.h>#include<stdlib.h>typedef struct SNode{char data;struct SNode *next;}SNode,*Stack;typedef struct{Stack top;int length;}SqStack;//定义链式栈的结构体char InitStack(SqStack &S){S.top=NULL;S.length=0;return 0;}//初始化链式栈char Push(SqStack &S,char e) {Stack p;p=(Stack)malloc(sizeof(SNode)); if(!p)exit(0); p->data=e;p->next=S.top;S.top=p;S.length++;return 0;}//插入元素echar Pop(SqStack &S){if(!S.top)return 0;else{Stack q;q=S.top;S.top=S.top->next; --S.length;free(q);}return 0;}//删除栈顶元素echar main(){SqStack S;char w,e;InitStack(S);//初始化链式栈printf("提示:输入“ = ”表示输入表达式结束,程序将自动检查括号是否匹配\n\n\n");printf("请输入表达式:\n\n\n");scanf("%c",&w);printf("\n");printf("\n");while(w!='='){switch(w){case '(': Push(S,w);break;case '[': Push(S,w);break;case ')': if(!S.top)return 0;elsee=S.top->data; if(e=='(')Pop(S); break;case ']': if(!S.top)return 0;elsee=S.top->data; if(e=='[')Pop(S); break;default: break;}scanf("%c",&w);}if(S.top==NULL)printf("输入括号匹配\n");else printf("输入括号不匹配,请检查后重新输入\n");return 0;}。
(数据结构)括号匹配的检验(源代码)
数据结构括号匹配问题#include<stdio.h>#include<stdlib.h>#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define INEEASLIBE -1#define OVERFLOW -2typedef int status;typedef char elemtype;typedef struct{elemtype *data;int length;elemtype *top;}list;status creat(list &L){L.data=(elemtype*)malloc(2*sizeof(elemtype));if(!L.data){return ERROR;}L.top=L.data;L.length=1;return OK;}status push(list &L,elemtype e){elemtype *dat;dat=(elemtype*)realloc(L.data,(L.length+1)*sizeof(elemtype));if(!dat){return ERROR;}L.data=dat;L.length++;*(L.top)=e;L.top++;return OK;}status pop(list &L,elemtype &e){if(L.top==L.data){printf("\n已是堆低无数据元素\n");return ERROR;}L.top--;e=*(L.top);return OK;}main(){list L;creat(L);char a[20],b;int i=0,m=0;while(i<20){printf("请输入括号序列:('#'表示输入结束)\n");scanf("%c",&a[i]);getchar();if(a[i]=='#'){break;}if(a[i]=='('||a[i]==')'||a[i]=='['||a[i]==']'||a[i]=='{'||a[i]=='}'||a[i]== '<'||a[i]=='>'){i++;}else{printf("输入的不是括号字符\n请重新输入\n");}}m=i;i=0;while(i<m){if(a[i]==']'||a[i]==')'||a[i]=='}'){if(L.top==L.data){printf("括号匹配出错\n");exit(0);}else{pop(L,b);if((a[i]-b)!=2&&(a[i]-b)!=1){printf("括号匹配出错\n");exit(0);}}}elsepush(L,a[i]);i++;}if(L.data!=L.top)printf("括号匹配出错\n");elseprintf("\n\n括号匹配成功\n");}THANKS !!!致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考。
数据结构实验报告:括号匹配问题
●实验内容:利用栈的基本操作,写一个C程序实现检测表达式“@{(a+b)*[c-d]+e}+f”中的括号是否匹配。
●实验目的:掌握栈的操作●提交内容:C语言源代码:#include <stdio.h>#include <string.h>#define MaxSize 100typedef char ElemType;typedef struct{ElemType data[MaxSize];int top;}SeqStack;int InitStack(SeqStack *s){s->top=-1;return 1;}int Push(SeqStack *s,ElemType x){if (s->top == MaxSize -1 ){printf("栈已满,不能入栈.\n");return 0;}else{s->top++;s->data[s->top] = x;}return 1;}int Pop(SeqStack *s,ElemType *x) {if (s->top == -1){printf("栈为空,不能出栈.\n");return 0;}else{*x=s->data[s->top];s->top--;}return 1;}int GetTop(SeqStack *s,ElemType *x) {if (s->top == -1){printf("栈为空,不能取值.\n");return 0;}else{*x=s->data[s->top];}return 1;}int IsEmpty(SeqStack *s) {if(s->top==-1)return 1;return 0;}int Check(char str[],int len) {int i;int a=1,b=0;ElemType x;SeqStack s;InitStack(&s);for(i=0;i<len;i++){if(str[i]=='{'){if(IsEmpty(&s)){if(Push(&s,str[i])!=1){a=0;break;}}else{if(GetTop(&s,&x)!=1){a=0;break;}if(x=='{' || x=='[' || x== '('){a=0;break;}else{if(Push(&s,str[i])!=1){a=0;break;}}}}else if(str[i]=='['){if(IsEmpty(&s)){if(Push(&s,str[i])!=1){a=0;break;}}else{if(GetTop(&s,&x)!=1){a=0;break;}if(x=='[' || x== '('){a=0;break;}else{if(Push(&s,str[i])!=1){a=0;break;}}}}else if(str[i]=='('){if(Push(&s,str[i])!=1){a=0;break;}b=1;}else if(str[i]==')'){if(Pop(&s,&x)!=1){a=0;break;}if(x!='('){a=0;break;}}else if(str[i]==']'){if(Pop(&s,&x)!=1){a=0;break;}if(x!='['){a=0;break;}if(b==0){a=0;break;}}else if(str[i]=='}'){if(Pop(&s,&x)!=1){a=0;break;}if(x!='{'){a=0;break;}if(b==0){a=0;break;}}elsecontinue;}if(!IsEmpty(&s))a=0;return a;}int main(){char str[MaxSize];int i,len;printf("输入字符串:\n");gets(str);len=strlen(str);if(Check(str,len)==0)printf("匹配合法\n");elseprintf("匹配不合法\n");。
利用顺序栈实现括号匹配 c语言精编版
S.top++;
}
void pop(SqStack &S,int &e)
{//出栈
if(S.base!=S.top)
{S.top--;
e=*S.top;}
}
void push(SqStack &S,int e);//进栈
void pop(SqStack &S,int &e);//出栈
//主函数开始
SqStack s;//初始化空栈
InitStack(s);
char ch[100],*p;int e;
p=ch;
printf("输一个含义有()[]{}的括号表达式:\n");
{//进栈
if(S.top-S.base>=S.stacksize)
{S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREAMENT;}
struct SqStack{
int *base; //栈底
int *top; //栈顶
int stacksize; //栈当前的存储空间
};
void main()
{//子函数声明
void InitStack(SqStack &S);//初始化空栈
int StackEmpty(SqStack S);//判空
{S.base=(int *)malloc(S_SIZE*sizeof(int));
链栈(括号匹配)
C语言数据结构中的链栈例题:将输入的字符串进行匹配,看匹配情况1.建立头文件stack.hstruct stacknode{char s;struct stacknode *next;};struct stack{struct stacknode *top;};2.建立各个函数及主函数//输入一行字符(带有括号),问这些括号是否配对//试验正确配对:1.([]()) 2.[([][])]//试验错误配对:1.[(])(不匹配)2.([())(左边多了)3.(()])(右边多了)#include<stdio.h>#include<string.h>#include<stdlib.h>#include"stack.h"void push(struct stack *sp,char c);void pop(struct stack *sp);int lookfor(void);char gettop(struct stack *sp);void main(){int state;state=lookfor();if(state)printf("Matching!\r\n");elseprintf("Not matching!\r\n");}/******************************************************************* 函数名称:lookfor函数功能:输入一个字符串,并查看其中的括号是否配对入口参数:void(类型)出口参数类型:int备注:调用多个函数,有入栈出栈和查询操作******************************************************************/ int lookfor(void){char string[100],e;int i=0,state=1;struct stack sp;//定义一个栈元素sp.top=NULL;//栈顶初始值为空printf("Please input a string with quiotions \r\n");scanf("%s",string);//输入一个字符串while( state && (i<strlen(string)))//条件是状态值为真,且循环变量小于字符串的长度{switch (string[i])//对每一个括号字符进行匹配{case '('://如果是左括号则进栈case '[':case '{':push(&sp,string[i]);printf("%c get in the stack\r\n",string[i]);//如果是右括号,则需要一个个进行匹配,因为'('和')'是不是匹配,计算机是不知道的{e=gettop(&sp);if((sp.top!=NULL) && ('('==e)){pop(&sp);printf("because '%c',so delete '%c' from the stack\r\n",string[i],e);//将每一个匹配的左括号出栈,并且显示在屏幕上i++;}else state=0;break;}case ']':{e=gettop(&sp);if((sp.top!=NULL) && ('['==e)){pop(&sp);printf("because '%c',so delete '%c' from the stack\r\n",string[i],e);//将每一个匹配的左括号出栈,并且显示在屏幕上i++;}else state=0;break;}case '}':{e=gettop(&sp);if((sp.top!=NULL) && ('{'==e)){pop(&sp);printf("because '%c',so delete '%c' from the stack\r\n",string[i],e);//将每一个匹配的左括号出栈,并且显示在屏幕上i++;}else state=0;break;}default:i++;//如果不是括号字符,而是其他字符,则将循环变量自增,继续匹配下一个字符}}if(sp.top!=NULL)//如果左括号有多余,也是不匹配的state=0;return (state);}/*********************************************************************函数名称:push函数功能:将数据n入栈入口参数:srruct stack *(参数类型)sp(参数名)出口参数类型:void备注:*********************************************************************/void push(struct stack *sp,char c){struct stacknode *newp;newp=(stacknode *)malloc(sizeof(stacknode));newp->s=c;newp->next=sp->top;sp->top=newp;}/********************************************************************* 函数名称:pop函数功能:将栈顶的左括号返回入口参数:srruct stack *(参数类型)sp(参数名)出口参数类型:char备注:*********************************************************************/ void pop(struct stack *sp){struct stacknode *to_free;to_free=sp->top;sp->top=to_free->next;free(to_free);}char gettop(struct stack *sp){char nnew;nnew=sp->top->s;return nnew;}。
C语言数据结构之栈:括号匹配
C语⾔数据结构之栈:括号匹配括号匹配这是个很简单的题⽬,如果只有⼩括号,就模拟进栈和出栈的过程就⾏了:注:输⼊时'@'作为结束标志#include <stdio.h>int main(){freopen("stack.in","r",stdin);freopen("stack.out","w",stdout);int in=0;char s[256];scanf("%s",&s);int i=0;while(s[i]!='@'){if(s[i]=='(') in++;if(s[i]==')') in--;if(in<0) break;i++;}if(in==0) printf("YES");else printf("NO");return0;}样例输⼊1:2*(x+y)/(1-x)@样例输出1:YES样例输⼊2:(25+x)*(a*(a+b+b)@样例输出2:NO⾄于多括号,就需要创建⼀个栈了:输⼊⽆需@做结尾#include <stdio.h>#include <string.h>char stack[256];int top=0;void push(char c){top++;stack[top]=c;}int pop(){top--;return(stack[top+1]);}int main(){freopen("check.in","r",stdin);freopen("check.out","w",stdout);char s[256];gets(s);int lenofs=strlen(s);int i;char c;for(i=0;i<=lenofs-1;i++){if(s[i]=='('){push('(');}if(s[i]==')'){push(')');c=stack[top-1];if(c=='('){pop();pop(); }}if(s[i]=='['){push('[');}if(s[i]==']'){push(']');c=stack[top-1];if(c=='['){pop();pop(); }}if(top<0) break;}if(top==0) printf("OK"); else printf("Wrong"); return0;}。
括号匹配问题源代码
#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define TRUE 1#define FLASE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef char ElemType;#define STACK_INIT_SIZE 100;typedef struct{ElemType *base;ElemType *top;int stacksize;}SqStack;#define STACKINCREMENT 10;typedef struct{ElemType *elem;int length;int listsize;}SqList;Status InitList_Sq(SqList &L){L.elem =(ElemType*)malloc(100*sizeof(ElemType));if(!L.elem )exit(OVERFLOW);L.length =0;L.listsize =STACKINCREMENT ;return OK;}Status InitStack (SqStack &S)//¹¹ÔìÒ»¸ö¿ÕÕ»{S.base=(ElemType * )malloc(100 * sizeof(ElemType));//ÐÞ¸Ä if(!S.base)exit(OVERFLOW);S.top =S.base ;S.stacksize = STACK_INIT_SIZE;return OK;}Status Push(SqStack &S,ElemType e)//²åÈëÔªËØΪеÄÕ»¶¥ÔªËØ{if(S.top -S.base >=S.stacksize ){S.base =(ElemType *)realloc(S.base,(S.stacksize +10 )*sizeof(ElemType));//ÐÞ¸Äif(!S.base )exit(OVERFLOW);S.top =S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top ++=e;return OK;}Status Pop(SqStack &S, ElemType &e)//ɾ³ýÕ»¶¥ÔªËØ{if(S.top ==S.base )return ERROR;e=*--S.top ;return OK;}Status StackEmpty (SqStack S)//ÅбðÕ»ÊÇ·ñΪ¿Õ{if(S.base ==S.top )return OK;elsereturn ERROR;}Status ListInsert_Sq(SqList &L,int i,ElemType e){ElemType *newbase,*q,*p;if(i<1||i>L.length +1)return ERROR;if(L.length >=L.listsize ){newbase=(ElemType *)realloc(L.elem ,(L.listsize +10)*sizeof(ElemType ));if(!newbase)exit(OVERFLOW);L.elem =newbase;L.listsize +=STACKINCREMENT ;}q=&(L.elem [i-1]);for(p=&(L.elem [L.length -1]);p>=q;--p) *(p+1)=*(p);*q=e;++L.length ;return OK;};Status brack_match(SqList &L){SqStack s;char e;int i;InitStack (s);for (i=0;i<L.length;i++){switch(L.elem[i]){case'('://push(s,L.elem[i]);break;case'['://push(s,L.elem[i]);break;case'{':Push(s,L.elem[i]);break;case')':{if (Pop(s,e)==ERROR||e!='(')return ERROR;elsebreak;}case']':{if (Pop(s,e)==ERROR||e!='[')return ERROR;elsebreak;}case'}':{if (Pop(s,e)==ERROR||e!='{')return ERROR;elsebreak;}}}if (StackEmpty (s)==ERROR)return ERROR;elsereturn OK;}void main (){SqList L;int i=1;char c;InitList_Sq(L);printf("ÇëÊäÈë´øÀ¨ºÅµÄ×Ö·û´®\n");while((c=getchar())!='\n')ListInsert_Sq(L,i++,c);if(brack_match(L)==OK)printf("À¨ºÅÆ¥Åä\n");elseprintf("À¨ºÅ²»Æ¥Åä\n");// for(int j=0;j<=9;j++)// putchar(l.elem [j]);}。
C语言实现括号配对问题
C语⾔实现括号配对问题代码如下:#include<stdio.h>#include<string.h>#include<stdlib.h>// 写⼀个判断的括号是否匹配的函数int MatchCheck(char a[],int len){int flag = 0;char s[10000];int top,i;char temp;// 初始化⼀个栈top = 0;for(i=0;i<len;i++){if(a[i]=='['){ // 如果是左括号直接⼊栈s[++top]=a[i];continue;}if(a[i]==']'){ // 如果是右括号,则尝试匹配temp = s[top];if(temp=='['){flag = 1;top--;continue;}else{flag = 0;break;}}if(a[i]=='('){ // 如果是左括号直接⼊栈s[++top]=a[i];continue;}if(a[i]==')'){ // 如果是右括号,则尝试匹配temp = s[top];if(temp=='('){flag = 1;top--;continue;}else{flag = 0;break;}}}if(flag&&(top==0)){return1;}else{return0;}}int main(){// 提⽰输⼊⼀个数int N,i;scanf("%d",&N);int len;// 对N组数据循环判断int count = 1;int result[5];while(count<=N){char a[10000]={'\0'};// 读⼊⼀⾏字符串scanf("%s",&a);// 求字符串的长度len = strlen(a);result[count]=MatchCheck(a,len);count++;}for(i=1;i<count;i++){if(result[i]){printf("Yes\n");}else{printf("No\n");}}return0;}样例输⼊和输出如下:。
括号匹配算法C语言实现
括号匹配算法C语⾔实现#include <stdio.h>#include <malloc.h> //malloc,realloc#include <math.h> //含有overflow#include <process.h> //exit()#define S_SIZE 100 //栈的空间⼤⼩#define STACKINCREAMENT 10//增加空间struct SqStack{int *base; //栈底int *top; //栈顶int stacksize; //栈当前的存储空间};void main(){//⼦函数声明void InitStack(SqStack &S);//初始化空栈int StackEmpty(SqStack S);//判空void push(SqStack &S,int e);//进栈void pop(SqStack &S,int &e);//出栈//主函数开始SqStack s;//初始化空栈InitStack(s);char ch[100],*p;int e;p=ch;printf("输⼀个含义有()[]{}的括号表达式:\n");gets(ch);while(*p){switch (*p){case'{':case'[':case'(': push(s,*p++);break;//只要是左括号就⼊栈case'}':case']':case')':pop(s,e);if ((e=='{' && *p=='}') ||(e=='[' && *p==']') || (e=='(' && *p==')'))p++;else{printf("括号不匹配!");exit(OVERFLOW);}break;default :p++;//其他字符就后移}}if (StackEmpty(s))printf("括号匹配成功");elseprintf("缺少右括号!");printf("\n");}void InitStack(SqStack &S){S.base=(int *)malloc(S_SIZE*sizeof(int));S.stacksize=S_SIZE;S.top=S.base;//初始化空栈}int StackEmpty(SqStack S){if(S.base==S.top)return1;elsereturn0;}void push(SqStack &S,int e){//进栈if(S.top-S.base>=S.stacksize){S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));S.top=S.base+S.stacksize;S.stacksize+=STACKINCREAMENT;}*(S.top)=e;S.top++;}void pop(SqStack &S,int &e){//出栈if(S.base!=S.top){S.top--;e=*S.top;}}检测表达式中的字符,若是左括号就⼊栈,如果是右括号就出栈⼀个元素与其配对,配对成功则继续访问下⼀个字符,否则退出。
C语言实验二、括号匹配
实验二、括号匹配一、问题描述假设一个输入字符串中包含圆括号、方括号和花括号三种类型的括号,以及其它一些任意字符。
编写程序,判别串中的括号是否正确匹配,即必须满足以下条件1.各种左、右括号的个数要一致;2.要符合正确的嵌套规则。
基本方法:在算法中设置一个栈,每读入一个括号,若是右括号,则或者使置于栈顶的最后进入的左括号消解,或者是不合法的情况;若是左括号,则压入栈中,同时在算法的开始和结束时,栈都应该为空,否则不合法。
二、基本要求输入一个算术表达式,利用栈存储结构来存入左括号,然后判断表达式中的括号是否匹配。
三、测试数据(1)([3+2]+(7*9))(2)[([3/2 ]-[5*6])](3)[7+8-(8-9])(4)(2+](3*9)))四、实现提示1、算法思路(1)对于栈的操作包括初始化initstack、判断栈是否满sfull、判断栈是否空sempty、入栈push和出栈pop操作。
该函数被主函数调用。
(2)在主函数中输入一个算术表达式,依次取出该算术表达式的某个字符,如果是左括号则入栈,如果是右括号则出栈,并判断右括号与出栈的元素是否匹配。
当算术表达式取完后,再判断栈是否为空,如果不空,则说明括号不匹配。
2、数据结构typedef struct stk//定义的栈结构{char *s; //栈中存放元素int top;//栈顶指针}stack;3、基本操作void initstack(stack *st) /* 栈s1和s2的初始化操作,st为指向s1或s2的指针 */int sfull(stack st) /* 判断栈s1和s2是否满的操作 */int sempty(stack st) /* 判断栈s1和s2是否空的操作 */int push(stack st,char e) /* 入栈操作,e为栈中结点类型 */int pop(stack *st,char *e) /*出栈操作,e为指向栈中结点的指针类型 */5、主程序main(){int i=0;char e;stack s1;//存放左括号的栈char str[100];//存放算术表达式的值initstack(&s1);printf("请输入表达式\n");gets(str);//输入算术表达式while(i<strlen(str)){if (str[i]=='('||str[i]=='['||str[i]=='{'){……}else if (str[i]==')'||str[i]==']'||str[i]=='}'){……else i++;}……}5、输出结果测试数据(1)([3+2]+(7*9))括号匹配(2)[([3/2 ]-[5*6])]括号匹配(3)[7+8-(8-9])第10个元素左右括号不匹配(4)(2+](3*9)))第4个元素左右括号不匹配。
圆括号匹配C语言可运行的
#include<stdio.h>#include<stdlib.h>//栈存储结构的定义#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef struct{char *base;char *top;int stacksize;}SeqStack;//栈初始化SeqStack InitSeqStack(){SeqStack s;s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));if(!s.base)exit(0);s.top=s.base;s.stacksize=STACK_INIT_SIZE;return s;}//入栈int Push_SeqStack(SeqStack S, char e){if(S.top-S.base>=S.stacksize){S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));/*栈满,追加存储空间*/if (!S.base)return 0;S.top=S.base+S.stacksize;S. stacksize+=STACKINCREMENT;}*S.top= e;S.top++;return 1;}//出栈int Pop_SeqStack(SeqStack S,char *e){if ( S.top==S.base)return 0; /* 栈空,返回失败标志 */S.top--;*e=*S.top;return 1;}//取栈顶元素int GetTop(SeqStack S,char *e){if(S.top==S.base) return 0;*e=*(S.top-1);return 1;}void BracketCorrespondency(char ch[]){SeqStack ss;int i;char c;ss=InitSeqStack();for(i=0;ch[i]!='#';i++)switch(ch[i]){case '(': //遇到'('就入栈Push_SeqStack(ss,ch[i]);break;case ')': //遇到')'就栈顶元素c相比较if(ss.top!=ss.base&&GetTop(ss,&c)&& c=='(')Pop_SeqStack(ss,&c); //如果匹配栈顶元素出栈else //如果不匹配,退出程序{printf("不匹配!\n");exit(0);}default: break;}if(ss.top==ss.base) //如果最后栈中还有剩余的元素则不匹配printf("匹配!\n");elseprintf("不匹配!\n");}void main(){char b[]="(())#";BracketCorrespondency(b); }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
括号匹配问题就是给定任意判别式,然后检验括号的配对出现的情况。
可见输入的表达式有四种可能性:右括号配对次序不正确、右括号多于左括号、左括号多于右括号、左右括号匹配正确。
可以先检测表达式中的字符,若是左括号就入栈,如果是右括号就出栈一个元素与其配对,配对成功则继续访问下一个字符,否则退出。
出现非括号字符则跳过。
程序流程图如下:
程序代码如下:
#include<iostream>
#include<string>
#include<process.h>
#include<stdlib.h>
#define MaxSize 50
using namespace std;
/*------------主要的数据结构类型 --------------*/
struct Text
{
int top;
char Szstack[MaxSize];
};
/*-------------程序功能模块函数-------------*/
//检验栈是否为空
bool IsEmpty(Text G)
{
if(G.top==-1)
return true;
else
return false;
}
//检验栈是否为满
bool IsFull(Text G)
{
if(G.top==MaxSize-1)
return true;
else
return false;
}
//弹出栈顶元素
char Pop(Text G)
{
char n=G.Szstack[G.top];
return n;
}
//检验括号是否配对
int Check(char *A)
{
int i;
Text G;
G.top=-1;
int L=strlen(A);
char c;
for(i=0;i<L;i++)
{
c=A[i];
switch(c)
{
case'(':
G.Szstack[++(G.top)]=c;
cout<<" 压入 ( top="<<G.top<<endl;
break;
case'[':
G.Szstack[++(G.top)]=c;
cout<<" 压入 [ top="<<G.top<<endl;
break;
case'{':
G.Szstack[++(G.top)]=c;
cout<<" 压入 { top="<<G.top<<endl;
break;
case')':
if(Pop(G)!='(')
{
return 0;
}
else
{
G.Szstack[G.top--];
cout<<" 当遇 ) 出栈 ( top="<<G.top<<endl; break;
}
case']':
if(Pop(G)!='[')
return 0;
else
{
G.Szstack[G.top--];
cout<<" 当遇 ] 出栈 [ top="<<G.top<<endl; break;
}
case'}':
if(Pop(G)!='{')
return 0;
else
{
G.Szstack[G.top--];
cout<<" 当遇 } 出栈 { top="<<G.top<<endl;
break;
}
default:break;
}
}
if(!IsEmpty(G))
return 0;
return 1;
}
/*-------------主函数-------------*/
int main()
{
system("color 75"); //设置颜色以美观
Text G;
char A[MaxSize];
cout<<"请输入需要检验的括号(括号数小于50):"<<endl;
cin>>A;
if(Check(A)==1)
{
cout<<" -----括号匹配-----"<<endl;
}
else
{
cout<<endl<<endl<<" -----括号不匹配-----"<<endl<<endl<<endl;
}
return 0;
}
以下分别是括号匹配与不匹配时的程序运行结果图:。