0
点赞
收藏
分享

微信扫一扫

关于在数据结构中的链栈里面判断用户输入的表达式的括号是否匹配。

卿卿如梦 2022-04-14 阅读 37

题目:用户输入一个表达式判断表达式里面的括号是否匹配

我的思路:把用户输入的表达式看成一个字符串,并且用遍历的方式把这些字符串进行一个个的匹配,如果括号有剩余就输出差的哪一个括号

部分代码

这里我用了一个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;
	}
}
举报

相关推荐

0 条评论