话不多说? 先上代码
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef struct node
{
char data;
struct node* next;
}LinkNode;
typedef struct
{
char data[MaxSize];
int top;
}SqStack;
void CreateList(LinkNode*& L);//输入表达式
void InitStack(SqStack*& s);//初始化顺序栈
void DestroyStack(SqStack*& s);//销毁顺序栈
bool StackEmpty(SqStack* s);//判断栈空否
bool Push(SqStack*& s, char e);//进栈
bool Pop(SqStack*& s);//出栈
int num(char ch);//括号数字化
int compare(int n1, int n2);//优先级比较
void function(LinkNode*& L, SqStack*& s);
void kuohao(LinkNode*& L);//输出括号匹配
int main()
{
LinkNode* L;
SqStack* s;
InitStack(s);
printf("请输入您的表达式:\n");
CreateList(L);
function(L, s);
printf("\n括号匹配结果如下:\n");
kuohao(L);
return 0;
}
//核心代码
void function(LinkNode*& L, SqStack *&s)
{
LinkNode* p;
p = L->next;
while (p != NULL) //首先扫一遍字符串
{
if (p->data == '(' || p->data == '[' || p->data == '{')
{
if (!StackEmpty(s)) //判断是否为空栈
{
Push(s, p->data);
}
//满足括号优先级比栈顶小的就入栈
else if(!compare(num(p->data), num(s->data[s->top])))
{
Push(s, p->data);
}
else
{
printf("括号匹配不正确"); return;
}
}
if (p->data == ')' || p->data == ']' || p->data == '}')
{
if(StackEmpty(s)) //如果空栈先遇到了右括号,则直接停止运行
{
if (num(p->data) + num(s->data[s->top]) == 10)
{
Pop(s);
}
else
{
printf("括号匹配不正确"); return;
}
}
else
{
printf("括号匹配不正确");return; //疑问?? 这里为什么要加上括号 单语句可以不用加括号啊
}
//不加括号输不出来 求大神请教
}
p = p->next;
}
if (!StackEmpty(s)) //扫完表达式之后观察栈中是否有括号
printf("括号匹配正确");
else
printf("括号匹配不正确");
}
void CreateList(LinkNode*& L)
{
LinkNode* s, * r;
char ch;
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
r = L;
while (true)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
scanf("%c", &ch);
if (ch == '\n') break;
s->data = ch;
r->next = s;
r = s;
}
r->next = NULL;
}
//初始化顺序栈
void InitStack(SqStack*& s)
{
s = (SqStack*)malloc(sizeof(SqStack));
s->top = -1;
}
//销毁顺序栈
void DestroyStack(SqStack*& s)
{
free(s);
}
//判断栈空否
bool StackEmpty(SqStack* s)
{
if (s->top == -1)
{
return false;
}
else
{
return true;
}
}
//进栈
bool Push(SqStack*& s,char e)
{
if (s->top == MaxSize - 1)
return false;
s->top++;
s->data[s->top] = e;
return true;
}
//出栈
bool Pop(SqStack*& s)
{
if (s->top == -1)
return false;
s->top--;
return true;
}
//括号数字化
int num(char ch)
{
switch (ch)
{
case '(':return 1;
case '[':return 2;
case '{':return 3;
case ')':return 9;
case ']':return 8;
case '}':return 7;
}
}
//优先级比较
int compare(int n1, int n2)
{
return n1 > n2 ? 1 : 0;
}
//输出括号匹配
void kuohao(LinkNode*& L)
{
LinkNode* p;
p = L->next;
while (p != NULL)
{
if (p->data == '(' || p->data == '[' || p->data == '{' || p->data == ')' || p->data == ']' || p->data == '}')
{
printf("%c", p->data);
}
p = p->next;
}
}
?
?
?
?????????问题是 () {} []三种括号的匹配,注意之间的顺序,优先级{}>[]>()。设计算法匹配括号
输入表达式要注意输入英文括号,而不是中文括号!!!
具体思路见代码!!!
最后代码可能会有点复杂,希望大家能够多提提建议。非常感谢!!
|