#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef char SElemType;
typedef struct/*堆疊的宣告*/
{
SElemType *base;/*指示存盤資料元素的空間基地址的指標*/
SElemType *top;/*堆疊頂指標*/
int stacksize;/*堆疊存盤空間大小,以資料元素為單位*/
}SqStack;
Status InitStack(SqStack *S)/*創建空堆疊*/
{
S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;
}/*建立一個堆疊*/
Status StackEmpty(SqStack *S)
{
if (S->top != S->base) return ERROR;
return OK;
}/*判斷堆疊是否為空*/
Status Push(SqStack *S, SElemType e)
{
if (S->top - S->base >= S->stacksize)
{
S->base = (SElemType*)realloc(S->base, (S->stacksize + STACKINCREMENT)*sizeof(SElemType));
if (!S->base)exit(OVERFLOW);
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return OK;
}/*入堆疊*/
Status Pop(SqStack *S, SElemType*e)
{
if (S->top == S->base) return ERROR;
*e = *--S->top;
return OK;
}/*出堆疊*/
Status Bracket(SqStack *S, char *str)/*判斷是否匹配*/
{
int i = 0, flag1 = 0, flag2;
SElemType e;
while (str[i] != '\0')
{
switch (str[i])
{
case '(':Push(S, '('); break;
case '[':Push(S, '['); break;
case '{':Push(S, '{'); break;
case ')':{ Pop(S, &e);
if (e != '(')
flag1 = 1;
break;
}
case ']':{ Pop(S, &e);
if (e != '[')
flag1 = 1;
break;
}
case '}':{ Pop(S, &e);
if (e != '{')
flag1 = 1;
break;
}
default: break;
}
if (flag1) break;
i++;
}
flag2 = StackEmpty(S);
if (!flag1 && flag2) printf("It is ok!\n");
else printf("It is error!\n");
return OK;
}
int main()
{
char temp, flag = 'y';
while (flag == 'y')
{
char str[255];
SqStack S;
InitStack(&S);
printf("enter a cross:");
scanf("%s", str);
scanf("%c", &temp);
Bracket(&S, str);
printf("do you want to try again(enter y again): ");
scanf("%c", &flag);
printf("\n");
}
printf("close.\n");
}
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/75952.html
標籤:基礎類
下一篇:計算機原始碼和補碼問題
