栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

(第1种)括号匹配,判断一个表达式中的括号是否匹配。

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(第1种)括号匹配,判断一个表达式中的括号是否匹配。

 前情提要

纯c版本,#号代表终止操作

#include
#include
#include
#define maxsize 100
typedef int status;//使后面可以使用status类型,用来表示成功或失败状态
#define ERROR -1
#define OK 1
typedef struct
{
	char *base;
	char *top;
	int stacksize;
}sqstack;
status init(sqstack *S)
{//顺序栈的初始化
	S->base=(char *)malloc(sizeof(char));
	if(!S->base) exit(OVERFLOW);
	S->top=S->base;
	S->stacksize=maxsize;
	return OK;
}

status push(sqstack *S,char e)//顺序栈入栈
{//插入元素e为新的栈顶元素
	if(S->top-S->base==S->stacksize) return ERROR;
	*S->top++=e; return OK;
}

char pop(sqstack *S)//顺序栈出栈
{//删除S的栈顶元素,用e返回其值
	char e;
	if(S->top==S->base) return ERROR;
	e=*(--S->top);
	return e;
}

char gettop(sqstack *S)//取栈顶元素
{//返回S的栈顶元素,不修改栈顶指针
	if(S->top!=S->base)
		return *(S->top-1);
}

status StackTraverse(sqstack *S)
{
// 从栈顶到栈底依次输出栈中的每个元素
	if(S->top==S->base)printf("The Stack is Empty!");//判断栈是否为空
	else
	{
		printf("The Stack is: ");
		S->top--;
		while(S->top>=S->base)            
		{
			printf("%c ", *S->top);
			S->top--;               
		}
	}
	printf("n");
	return OK;
}

void choose()
{
	printf("命令展示n");
	printf("1:展示栈顶元素n");
	printf("2:插入新元素n");
	printf("3:删除栈顶元素n");
	printf("4:展示栈元素n");
	printf("5:退出n");
	printf("6:括号匹配n");
}

void order(sqstack *S)
{
	int n;char e;
	choose();
	printf("请问你想选择的功能n");
	scanf("%d",&n);
	switch(n)
	{
	case 1: e=gettop(S);printf("栈顶元素是:%cn",e);order(S);break;
	case 2: {
		printf("请输入你要插入的元素:n");
		scanf("%s",&e);
		push(S,e);order(S);break;
			}
	case 3: {
		printf("返回的被删除栈顶元素:");
		e=pop(S);putchar(e);putchar('n');
		order(S);break;
			}
	case 4:StackTraverse(S);order(S);break;
	case 5: exit(0);break;
	case 6:if(check(S))
			   printf("匹配正常");
		   else printf("匹配错误");
			   break;
	default:exit(0);
	}
}

int main()
{
	sqstack Sta;
	sqstack *S=&Sta;
	init(S);
	order(S);
	return 0;
}

status check(sqstack *S)//读取和比较
{
	char *p,e;
	printf("n启动括号匹配程序n");
	printf("请输入你的算式n");
	scanf("%c",&e);            //第一个括号的检测
    while(e!='(' && e!='[')        //忽略数字等其他符号,直到输入括号
    {
        if(e==')' || e==']' || e=='#')    return ERROR;    //若为')'或']',则表明不匹配。'#'用于结束输入
        scanf("%c",&e);    
    }
    if(e=='(' || e=='[')    push(S,e);    //检测到左括号,进栈
    scanf("%c",&e);
	while(e!='#')
	{
		if(e=='('||e=='['||e==')'||e==']')
			push(S,e);
		p=S->top;
		if(*(p)==')')
		{
			if(*(p--)=='(')
			{
					printf("%c ",pop(S));
                    printf("%cn",pop(S));
			}
			else if(*(p--)==']'||*(p--)=='[') 
				return ERROR;
		}
		else if(*p==']')
		{
			if(*(p--)=='[')
			{
					printf("%c ",pop(S));
                    printf("%cn",pop(S));
			}
			else if(*(p--)=='(') 
				return ERROR;
		}
		scanf("%c",&e);
	}
	if(S->top==S->base)    return OK;
	else return ERROR;
}

输出

 输入

6
(5+6)*[9-5]#

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/303051.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号