演算法——括號匹配問題(堆疊應用)
阿新 • • 發佈:2019-02-18
【例】假設有一個算術表示式包含圓括號、方括號和花括號,編寫一個函式,用來判別表示式中的括號是否正確匹配,並設計一個測試主函式。
【分析】括號匹配共有一下四種情況:
①左、右括號匹配不正確;
②右括號多於左括號;
③左括號多餘右括號;
④左右括號匹配正確。
另外,還應該想到,“何時進棧”,“何時出棧”,“何時取棧頂元素”,“何時棧空”
typedef struct
{
DataType stack[MaxStackSize];
int top; //top表示順序堆疊陣列stack的當前棧頂位置
}SeqStack;
void StaticInitiate(*S)
{
S->top=0 ; //初始化棧頂下標值
}
int StackNotEmpty(S) //判斷順序堆疊S是否為空,非空返回1,否則返回0
{
if(S.top<=0)return 0;
else return 1;
}
int StackPush(SeqStack *S,DataType x)//把資料元素x存入順序堆疊S中,入棧成功返回1,否則返回0
{
if(S->top>=MaxStackSize)
{
printf("堆疊已滿,無法插入!\n")
return 0;
}
else
{
S->Stack[S->top]=x;
S->top++;
return 1;
}
}
int StackPop(SeqStack *S,DataType) //取出順序堆疊S的棧頂元素值由引數d帶回,出棧成功則返回1,否則返回0
{
if(S->top<=0)
{
printf("堆疊已空無資料元素出棧!\n");
return 0;
}
else
{
S->top--; //得注意top--,--top的差別
*d=S->stack[S->top];
return 1;
}
}
int StackTop(SeqStack S,DataType *d) //取棧頂資料元素值由引數d帶回,成功返回1,不成功返回0
{
if(S.top<=0)
{
printf("堆疊已空!\n");
return 0;
}
else
{
*d=S.stack[S.top-1];
return 1;
}
}
測試主函式:
#include<string.h>
#include<stdio.h>
#define MaxStackSize 100
typedef char DataType;
#include"SeqStack.h"
void ExpIsCorrect(char exp[],int n)
{
SeqStack myStack;
int i;
char c;
StackInitiate(&myStack);
for(i=0;i<n;i++)
{
if((exp[i]=='(')||(exp[i]=='[']||(exp[i]=='{'))
{
StackPush(&myStack,exp[i]);
}
else if(exp[i]==')'&&StackNotEmpty(myStack)&&StackTop(myStack,&c=='(')
{
StackPop(&myStack,&c);
}
else if(exp[i]==')'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c=='(')
{
printf("左右括號匹配不正確!\n");
return 0;
}
else if(exp[i]==']'&&StackNotEmpty(myStavk)&&StackTop(myStack,&c)&&c=='[')
{
StackPop(&myStack,&c);
}
else if(exp[i]==']'&&StackNotEmpty(mySatck)&&StackTop(myStack,c)&&c!='[')
{
printf("左右括號匹配次序不正確!\n");
return;
}
else if(exp[i]=='}'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c=='{')
{
StackPop(&myStack,&c);
}
else if(exp[i]=='}'&&StackNotEmpty(myStack)&&StackTop(myStack,&c)&&c!='{')
{
printf("左右括號匹配次序不正確!\n");
return;
}
else if(((exp[i]==')')||(exp[i]==']')||(exp[i]=='}'))&&!=StackNotEmpty(myStack))
{
printf("右括號多於左括號!\n");
return;
}
}
if(StackNotEmpty(myStack))
{
printf("左括號多於右括號!\n");
}
else
{
printf("左右括號匹配正確!\n");
}
}
void main()
{
char a[]="(())abc{[]()}";
char b[]="(()))abc{[]}";
char c[]="(()()abc{[]}";
char d[]="(())abc{[]}";
int n1=strlen(a);
int n2=strlen(b);
int n3=strlen(c);
int n4=strlen(d);
ExpIsCorrect(a,n1);
ExpIsCorrect(b,n2);
ExpIsCorrect(c,n3);
ExpIsCorrect(d,n4);
}