#include<stdio.h>
#include<stdlib.h>
typedef char stackelemtype;
#define MAXSIZE 100
//定義堆疊-順序堆疊
typedef struct
{
stackelemtype elem[MAXSIZE];
char top;
}seqstack;
//順序堆疊的初始化
void initstack(seqstack *s)
{
s->top=-1;
}
//順序堆疊進堆疊
char push(seqstack *s,stackelemtype x)
{
if(s->top==MAXSIZE-1)
return 0;
else
{
s->top++;
s->elem[s->top]=x;
return 1;
}
}
//判斷是否初始化
int isempty(seqstack *s)
{
if(s->top==-1)
return 1;
else
return 0;
}
//順序堆疊出堆疊
char pop(seqstack *s,stackelemtype *x)
{
if(s->top==-1)
return 0;
else
{ *x=s->elem[s->top];
s->top--;
return 1;
}
}
//順序堆疊讀堆疊頂元素
char gettop(seqstack *s,stackelemtype *x)
{
if(s->top==-1)
return 0;
else
{
*x=s->elem[s->top];
return 1;
}
}
//進行匹配
int match(char ch,char str)
{
if(ch=='('&&str==')')
return 1;
else if(ch=='['&&str==']')
return 1;
else if(ch=='{'&&str=='}')
return 1;
else
return 0;
}
//括號匹配
void bracketmatch(char *str)
{
seqstack s;
int i;
char ch;
initstack(&s);
for(i=0;str[i]!='\n';i++)
{
switch(str[i])
{
case'(':
case'[':
case'{':
push(&s,str[i]);
break;
case')':
case']':
case'}':
if(isempty(&s))
{
printf("\n右括號多余!");
return;
}
else
{
gettop(&s,&ch);
if(match(ch,str[i]))
pop(&s,&ch);
else
{
printf("\n對應的左右括號不同類!");
return;
}
}
}
}
if(isempty(&s))
printf("\n括號匹配!");
else
printf("\n左括號多余!");
}
void main()
{
char a[50];
printf("請輸入一個括號字串:");
scanf("%s", a);
bracketmatch(a);
}
哪兒錯了
uj5u.com熱心網友回復:
僅供參考:#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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/201893.html
標籤:C++ 語言
下一篇:無法洗掉檔案
