括号匹配问题,到底错在哪了,请各位赐教。
#include<iostream>c++ c
#include<cstring>
using namespace std;
struct stack{
int p;
char *s;
};//定义栈,这里我让p=0了。s用来存放进栈的元素。
void push(stack *pst,char z){
*(pst->s)=z;
pst->p++;
pst->s++;
}//入栈,
void pop(stack *pst){
pst->p--;
pst->s--;
}出栈,
int main(){
char ss[10000];//存放待检测的括号串。
stack *po;
po=new stack;
int n;
cin>>n;
int i=1;
while(i<=n){
cin>>ss;
po->p=0;
if(strlen(ss)%2!=0||ss[0]==']'||ss[0]==')') cout<<"No"<<endl;
else{
po->s=new char[strlen(ss)+1];//为栈申请内存。
char *pu=ss;
while(*pu!='\0'){
if(*pu=='('||*pu=='[') push(po,*pu);
else if(*pu==')'&&*(po->s-1)=='('||*pu==']'&&*(po->s-1)=='[') pop(po);
else {cout<<"NO"<<endl;po->p=-1;break;}//都不符合时置po->p为-1,类似flag,输出no,
pu++;
}
if(po->p==-1) {i++;continue;}
else if(po->p==0) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
i++;
}
return 0;
}
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 10
#define STACK_GROW_SIZE 5
#define ELEMTYPE char
#define OK 1
#define ERROR 0
typedef struct { /*建立一个栈的首结点*/
ELEMTYPE * base;
ELEMTYPE * top;
int stacksize;
} SpStack;
int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/
s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));
if (!s->base) return ERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
int StackEmpty(SpStack *s) { /*判断栈是否为空*/
if (s->top==s->base) return OK;
else return ERROR;
}
int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/
if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));
if (!s->base) return ERROR;
s->stacksize+=STACK_GROW_SIZE;
s->top=s->base+s->stacksize;
}
*s->top++=e;
return OK;
}
int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/
if (StackEmpty(s)) return ERROR;
*e=*(--s->top);
return OK;
}
int Comp(ELEMTYPE a,ELEMTYPE b) {
if ((a=='('&&b!=')')
[解决办法]
(a=='['&&b!=']')
[解决办法]
(a=='{'&&b!='}')) {
return ERROR;
} else return OK;
}
int Count(SpStack *s) {
ELEMTYPE e[STACK_INIT_SIZE*2];
ELEMTYPE e1;
int i;
InitStack(s);
fgets(e,STACK_INIT_SIZE*2,stdin);
if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;
printf("%s\n",e);
for (i=0;e[i]!='\0';i++) {
switch (e[i]) {
case '(':
case '[':
case '{':
Push(s,e[i]);
break;
case ')':
case ']':
case '}':
if (StackEmpty(s)) {
printf("%*s↖右括号多余\n",i+1,"");
return(ERROR);
} else Pop(s,&e1);
if (!Comp(e1,e[i])) {
printf("%*s↖左右匹配出错\n",i+1,"");
return(ERROR);
}
}
}
if (!StackEmpty(s)) {
printf("%*s↖左括号多余\n",i,"");
return(ERROR);
} else {
printf("匹配正确\n");
return(OK);
}
}
void main() {
SpStack s;
Count(&s);
free(s.base);
}