使用的DEVC++環境
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR -1
typedef struct{ //定義順序堆疊的存盤結構
char *base;
char *top;
int stacksize;
}SqStack;
void InitStack(SqStack *s) //建空堆疊
{
s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s->base) exit(1);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
int GetTop(SqStack *s,char *e)
{
if(s->top==s->base) return ERROR;
*e=*(s->top-1);
return 1;
}
void push(SqStack *s,char e)
{
if((s->top-s->base)>=s->stacksize) //堆疊已滿,重新分配存盤空間
{
s->base=(char*)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(char));
if(!s->base) exit(1);
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=e;
}
int pop(SqStack *s,char *e)
{
if(s->top==s->base) return 0;
*e=*--s->top;
return 1;
}
int StackEmpty(SqStack *s)
{
if(s->top==s->base) return 1; //堆疊空,回傳值為1
else return 0;
}
int BracketsMatch(SqStack *s,char b[])
{
InitStack(s);
int i=0;
char *e;
while(b[i]!='#')
{
switch (b[i])
{
case '(': push(s,b[i]); break;
case '{': push(s,b[i]); break;
case '[': push(s,b[i]); break;
case ')':
if(StackEmpty(s)) return 0;
pop(s,e);
if(*e!=b[i]) return 0;
break;
case ']':
if(StackEmpty(s)) return 0;
pop(s,e);
if(*e!=b[i]) return 0;
break;
case '}':
if(StackEmpty(s)) return 0;
pop(s,e);
if(*e!=b[i]) return 0;
break;
}
++i;
}
if(StackEmpty(s)) return 1; //堆疊空,則匹配
else return 0; //否則,不匹配
}
int main()
{
SqStack *s;
char b[100],a;
int i=0,j;
do{
printf("請輸入一個括號(#為結束字符):\n");
scanf("%c",&b[i]);
a=b[i];
i++;
}while(a!='#');
j=BracketsMatch(s,b);
if(j==1) printf("括號匹配!\n");
else printf("括號不匹配!\n");
return 0;
}

但是運行時,回圈陳述句總是打出來三遍,并且輸入#結束回圈但是沒反應就直接退出程式了。
不知道邏輯上哪里出了問題,之前也有過回圈中printf陳述句每次列印三遍的情況,這到底是怎么回事?
各位大神請指教!!!
還有就是,在BracketsMatch函式里,只有堆疊指標s,其實像GetTop這樣函式的引數不需要用*s但是,
在BracketsMatch里最開始就用了*s來創建堆疊,如果不用,只想以形參形式,該怎么辦呢?要再定義一個
Stack型的變數,然后把*s堆疊賦給它嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/234074.html
標籤:C語言
上一篇:關于物件作為判斷條件
