栈基本特点:“后进先出”,好比子弹上膛,最后放入弹夹中的子弹最先被射出,正因为栈有此特性,栈可以解决许多实际问题,例如即将讨论的括号匹配问题。
多说不易,来张图唤醒一下。
子弹上膛示意图
栈的特性类似于子弹上膛后射出的情形,最后装入弹夹的子弹最先射出。
**问题描述:**输入一串字符,判断其中括号是否匹配,括号意外字符被忽视。例如:{ [ ] ( ) },{}[]***999&%90(),( *#&[ { } ] )均为括号相匹配的字符串;而{ [ ] ] () },( ] ] ] )或[ ) ( { { ]均为括号不匹配的字符串。
关于此处的程序使用的顺序栈(数组)来存储数据。
#include<stdio.h>
#include<stdlib.h>
#define MAX 50
typedef struct
{
char stack[MAX]; /*数组实现栈*/
int top; /*栈顶位置下标*/
}SeqStack;
void InitStack(SeqStack *s) /*初始化栈*/
{
s->top=-1;
}
int Push(SeqStack *s,char x) /*进栈*/
{
if(s->top+1==MAX)
return 1;
else
{
s->top++;
s->stack[s->top]=x;
return 0;
}
}
int Pop(SeqStack *s,char *ch) /*出栈*/
{
if(s->top==-1)
return 1;
else
{
*ch=s->stack[s->top];
s->top--;
return 0;
}
}
int GetTop(SeqStack *s,char *x) /*读取栈顶元素*/
{
if(s->top==-1)
return 1;
else
{
*x=s->stack[s->top];
return 0;
}
}
int IsEmpty(SeqStack *s) /*判断是否为空栈*/
{
if(s->top==-1)
return 1;
else
return 0;
}
int Match(char ch1,char ch2) /*判断括号是否为同一类型*/
{
if((ch1=='['&&ch2==']')||(ch1=='{'&&ch2=='}')||(ch1=='('&&ch2==')'))
return 1;
else
return 0;
}
void Smatch(char *str) /*判断字符串中的括号*/
{
int i;
char ch;
SeqStack s;
InitStack(&s);
for(i=0;str[i]!='\0';i++)
{
switch(str[i])
{
case '(':
case '[':
case '{':Push(&s,str[i]);break; /*左括号进栈*/
case ')':
case ']':
case '}':
if(IsEmpty(&s)) /*读到右括号,如果栈为空,则右括号多余*/
{
printf("\n右括号多余\n\n");
return;
}
else
{
GetTop(&s,&ch);
if(Match(ch,str[i])) /*Match判断两个括号是否匹配*/
Pop(&s,&ch); /*已匹配的左括号出栈*/
else
{
printf("\n对应的左右括号类型不匹配!\n\n");return;
}
}
}
}
if(IsEmpty(&s))
printf("\n括号匹配\n\n");
else
{
printf("\n左括号多余!\n\n");
}
}
int main()
{
char b[50];
printf("请输入字符:");
gets(b);
Smatch(b);
system("pause");
return 0;
}
此程序综合运用到了关于栈的一些相关操作,对学习栈的小伙伴们有复习巩固的作用。此程序部分出于教材。本小白也是第一次发博客,程序如有不足,还希望读者给予宝贵意见!