今天我们继续来看数据结构中栈的应用第四个问题——括号匹配问题(C语言实现版)。括号匹配就是利用栈的先进后出的灵活性来进行匹配。下面让我们一起来看看吧
源代码:
#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>
#define size 50
typedef struct {
char elem[size];
int top;
}seqstack;
void initStack(seqstack* s)
{
s->top = -1;
}
int Push(seqstack* s, char str)
{
int i = 0;
if (s->top == size - 1) return 1;
else if (str != '\0')
{
s->top++;
s->elem[s->top] = str;
}
return 0;
}
int pop(seqstack* s, char* str)
{
if (s->top == -1) return 1;
else {
*str = s->elem[s->top];
printf("%c", *str);
s->top--;
}
return 0;
}
int gettop(seqstack* s, char* ch)
{
if (s->top == -1) return 1;
else {
*ch = s->elem[s->top];
return 1;
}
}
bool Match(char ch, char str)
{
if ((ch == '<' && str == '>') || (ch == '{' && str == '}') || (ch == '(' && str == ')'))
return 1;
else
return 0;
}
bool isEmpty(seqstack* s)
{
if (s->top == -1) return 1;
else return 0;
}
void brackMatch(char* str)
{
seqstack s, * p;
int i;
char ch, sh;
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右括号多余");
}
else {
gettop(&s, &ch);
if (Match(ch, str[i]))
{
pop(&s, &sh);
}
else
{
printf("\n对应的括号不匹配");
return;
}
}
}
}
if (isEmpty(&s))
{
printf("\n括号匹配");
}
else
printf("\n左括号多余");
}
int main()
{
char str[100], enter, ch;
seqstack s;
initStack(&s);
printf("请输入字符串:\n");
scanf_s("%s", str,250);
scanf_s("%c", &enter,300);
brackMatch(str);
printf("\n");
}
#include <stdio.h>
#include <stdlib.h>
#include<stdbool.h>
#define size 50
typedef struct {
char elem[size];
int top;
}seqstack;
void initStack(seqstack* s)
{
s->top = -1;
}
int Push(seqstack* s, char str)
{
int i = 0;
if (s->top == size - 1) return 1;
else if (str != '\0')
{
s->top++;
s->elem[s->top] = str;
}
return 0;
}
int pop(seqstack* s, char* str)
{
if (s->top == -1) return 1;
else {
*str = s->elem[s->top];
printf("%c", *str);
s->top--;
}
return 0;
}
int gettop(seqstack* s, char* ch)
{
if (s->top == -1) return 1;
else {
*ch = s->elem[s->top];
return 1;
}
}
bool Match(char ch, char str)
{
if ((ch == '<' && str == '>') || (ch == '{' && str == '}') || (ch == '(' && str == ')'))
return 1;
else
return 0;
}
bool isEmpty(seqstack* s)
{
if (s->top == -1) return 1;
else return 0;
}
void brackMatch(char* str)
{
seqstack s, * p;
int i;
char ch, sh;
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右括号多余");
}
else {
gettop(&s, &ch);
if (Match(ch, str[i]))
{
pop(&s, &sh);
}
else
{
printf("\n对应的括号不匹配");
return;
}
}
}
}
if (isEmpty(&s))
{
printf("\n括号匹配");
}
else
printf("\n左括号多余");
}
int main()
{
char str[100], enter, ch;
seqstack s;
initStack(&s);
printf("请输入字符串:\n");
scanf_s("%s", str,250);
scanf_s("%c", &enter,300);
brackMatch(str);
printf("\n");
}
程序执行图:
本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.