题目:用户输入一个表达式判断表达式里面的括号是否匹配
我的思路:把用户输入的表达式看成一个字符串,并且用遍历的方式把这些字符串进行一个个的匹配,如果括号有剩余就输出差的哪一个括号
部分代码
这里我用了一个result来保存缺少括号时的状态,p表示这个栈,首次把它设置为空,c用来表示接收键盘的输入,并且要遍历它。
int result=0;
LinkStack p;
p=NULL;//这里表示是一个空栈,头节点为空
printf("输入一个表达式,以#结束:");
char c;
scanf("%c",&c);
在这里的代码就是对c进行遍历,这里的#表示用户输入了#就结束输入开始下面的操作
//对c进行一个遍历,并且左括号进栈,遇到一个右括号就出栈一个左括号,如此进行一个匹配
while(c!='#')
{
if(c=='(')
p=PushLinkStack(p,c);//进栈函数
else if(c==')')
{
if (p==NULL)
{
result=1;//此处的1表示的是当右括号没有与之对应的左括号的状态
break;
}
else
p=PopLinkStack(p);//当左右括号匹配成功时出栈
}
scanf("%c",&c);
}
这里的代码就很好理解了,就是当左右括号不匹配时所作出的判断
if(p!=NULL)
printf("少右括号\n");
else if(result==1)
printf("少左括号\n");
else
printf("匹配\n");
下面的是就是一些进栈和出栈函数代码:
#include <stdio.h>
#include <stdlib.h>
typedef char datatype;
typedef struct Node
{
datatype data;
struct Node *next;
}SNode,*LinkStack;
LinkStack PushLinkStack(LinkStack top,datatype x)//进栈
{
LinkStack p;
p=(LinkStack)malloc(sizeof(SNode));
p->data=x;
p->next=top;
top=p;
return p;
}
LinkStack PopLinkStack(LinkStack top)//出栈
{
LinkStack p;
p=top;
if(top==NULL)
{
printf("空栈不能出栈!");
return NULL;
}else{
p=top;
top=top->next;
printf("%c出栈完成\n",p->data);
free(p);
return top;
}
}
void PrintLinkStack(LinkStack top)//输出栈内的数据
{
LinkStack p;
p=top;
if(top==NULL)
{
printf("空栈!");
return;
}
else{
printf("栈包含一下元素:");
while (p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
return;
}
}