⭐ 我的網站: www.mengyingjie.com ⭐
編寫程序檢查該字符串的括號是否成對出現,而且不能交叉出現。
輸入:
一個字符串,裏邊可能包含“()”、"{}"、“[]”三種括號,“#”結束
輸出:
成功:代表括號成對出現並且嵌套正確
失敗:未正確使用括號字符。
分析
用一個棧,就能解決該問題,左括號棧頂字符必須和第一個入棧的右括號字符匹配。
棧介紹:棧是一種特殊的線性表,僅能在線性表的一端操作。
棧的特性:後進先出(LIFO)
由於正在學數據結構,於是棧的定義與操作都是自己編寫的,爲了鞏固概念
#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define STACK_INT_SIZE 100
#define STACKINCREMENT 10
#define bool int
#define true 1
#define false 0
#define TRUE 1
#define FALSE 0
#define SElemType char
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//------基本操作的函數原型說明------
bool InitStack(SqStack *S);
//構建一個空棧
bool DestroryStack(SqStack *S);
//銷燬棧S S 不再存在
bool ClearStack(SqStack *S);
//讓S 變成一個空棧
bool StackEmpty(SqStack *S);
//判斷S是否爲空棧 ,爲空棧返回true 否則返回false
int StackLength(SqStack S);
//返回S的元素個數,及爲S的長度
bool GetTop(SqStack S);
//若棧不爲空,返回棧頂元素,並返回true 否則返回 false
bool Push(SqStack *S,SElemType e);
//插入元素 違心的棧頂元素
bool Pop(SqStack *S,SElemType *e);
//若棧不爲空,則刪除棧頂元素,用e返回其值,返回true, 否則返回false
bool StackTraverse(SqStack S,bool(*vist)());
//從棧底到棧頂依次對每一個元素visit(),一旦visit失敗,則操作失敗
//------基本操作的算法描述------
InitStack(SqStack *S)
{
S->base = (SElemType *)malloc(STACK_INT_SIZE*sizeof(SElemType));
if(!S->base) return 0;
S->top = S->base;
S->stacksize = STACK_INT_SIZE;
return 1;
}
GetTop(SqStack S)
{
if(S.top==S.base) return 0;
return *(S.top-1);
}
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) return 0;
S->top = S->base + S->stacksize;
S->stacksize +=STACKINCREMENT;
}
*(S->top++)=e;
return 1;
}
Pop(SqStack *S,SElemType *e)
{
if(S->top==S->base) return 0;
*e = *(--S->top);
return 1;
}
int CheckChar(char c, char OP[])
{
int i;
for(i=0; i<3; i++)
if(c==OP[i])return i;
return 999;
}
int main()
{
SqStack OPTR;
InitStack(&OPTR);
Push(&OPTR,'#');
printf("輸入括號以“#”結尾\n");
char c;
c=getchar();
int m=1; //判斷最終是否完全匹配 完全匹配 值爲1,否則爲0
char OP1[] = {'[','(','{'};
char OP2[] = {']',')','}'};
while(c!='#')
{
if(CheckChar(c,OP1)<3)
{
Push(&OPTR,c);
c=getchar();
}
else
{
if(CheckChar(GetTop(OPTR),OP1)==CheckChar(c,OP2))
{
//printf(" -+ ");
Pop(&OPTR,&c);
c=getchar();
continue;
}
else
{
m=0;
break;
}
}
}
if(GetTop(OPTR)!=c)m=0;
if(m==1)printf("\n括號完全匹配!");
else printf("\n括號匹配失敗!");
return 0;
}
遇到此類問題,但看了文章還是未解決,
評論或加 QQ:781378815