圆括号是否正确配对

该程序设计了一个算法来检查一个算术表达式的圆括号是否正确配对。它使用栈数据结构,读取输入的字符串表达式,通过遍历和压栈操作来判断括号匹配情况。当遇到左括号时,压入栈中;遇到右括号时,与栈顶的左括号匹配。最后,比较栈中剩余的左括号和右括号数量来确定是否所有括号都已正确配对。
摘要由CSDN通过智能技术生成

【问题描述】

设计一个算法判别一个算术表达式的圆括号是否正确配对

【输入形式】

一个任意字符串表达式

【输出形式】

若配对,则输出圆括号的对数;否则输出no

【样例输入】(a+b)/(c+d)@

【样例输出】 2

【样例说明】共有两对括号,输出2

【评分标准】

使用栈相关知识,否则不能得分

主函数

#include"_STACK_H_.h"

int main(void)
{
	Stack_Order stack;
	Stack_Order stack1;
	Stack_Order stack2;
	PStack pstack;
	PStack pstack1;
	PStack pstack2;
	pstack = &stack;
	pstack1 = &stack1;
	pstack2 = &stack2;
	char x;
	int longs=0;
	Order_Create_Stack(pstack);
	Order_Create_Stack(pstack1);
	Order_Create_Stack(pstack2);
	if (Order_Stack_Judgment==false)
	{
		printf("内存不足,再见!");
		exit(1);
	}
	while (scanf("%c", &x)!=EOF)
	{
		Order_Stack_Push(pstack, &x);
	}
	while (Order_Stack_Judgment(pstack) == false)
	{
		Order_Stack_Pop(pstack, &x);
		if (x == '(')
		{
			Order_Stack_Push(pstack1, &x);
		}
		else if (x == ')')
		{
			Order_Stack_Push(pstack2, &x);
		}
	}
	if (Order_Stack_Long(pstack1)==Order_Stack_Long(pstack2)&& Order_Stack_Long(pstack1)!=0)
	{
		if (Order_Stack_Judgment(pstack1) == false)
		{
			if (Order_Stack_Judgment(pstack2) == false)
			{
				longs = Order_Stack_Long(pstack2);
				printf("%d", longs);
			}
		}
	}
	else
	{
		printf("no");
	}
	return 0;
}

头文件

#ifndef _STACK_H_
#define _STACK_H_

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>

/*特殊量定义区*/

//栈的数据类型
#define Data_Type char

//顺序栈的大小
#define Data_Size 20

/*结构体定义区*/

//数据域结构体
typedef struct Data
{
	Data_Type data[Data_Size];
	int stack_top;
}Stack_Order;

typedef Stack_Order* PStack;
/*函数声明区*/

//操作:	创建一个空栈
//前置条件:传入一个栈的指针
//后置条件:如果创建成功返回true,否则返回false
bool Order_Create_Stack(PStack pstack);

//操作:	把一个栈置为空栈
//前置条件:传入一个栈的指针
//后置条件:如果创建成功返回true,否则返回false
bool Order_Stack_Empty(PStack pstack);

//操作:	判断栈是否为空栈
//前置条件:输入一个栈的地址
//后置条件:如果栈为空返回true,否则返回false
bool Order_Stack_Judgment(PStack pstack);

//操作:	返回栈的长度 
//前置条件:输入一个栈的地址
//后置条件:返回栈的长度
int Order_Stack_Long(PStack pstack);

//操作:	插入一个元素data为栈顶元素
//前置条件:输入一个栈的地址,和插入元素的地址
//后置条件:插入成功返回true,否则返回false
bool Order_Stack_Push(PStack pstack,Data_Type* data);

//操作:	弹出栈顶元素
//前置条件:输入一个栈的地址,一个栈数据类型data的地址
//后置条件:将栈顶数据交给data,删除栈顶元素,成功返回true,否则返回false
bool Order_Stack_Pop(PStack pstack,Data_Type* data);

//操作:	输出栈顶元素
//前置条件:输入一个栈的地址,一个栈数据类型data的地址
//后置条件:成功返回true,否则返回false
bool Order_Stack_GetTop(PStack pstack, Data_Type* data);

//操作:	从栈底到栈顶依次对栈中每个元素显示 
//前置条件:输入栈的地址
void Order_Stack_Print(Stack_Order stack);

//操作:	打印当前数据
//前置条件:输入当前数据
void Order_Stack_visit(Data_Type data);


#endif // !_STACK_H_

引用函数

#include"_STACK_H_.h"

bool Order_Create_Stack(PStack pstack)
{
	pstack->stack_top = -1;
	return true;
}

bool Order_Stack_Empty(PStack pstack)
{
		pstack->stack_top = -1;
		return true;
}

bool Order_Stack_Judgment(PStack pstack)
{
	if (pstack->stack_top == -1)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int Order_Stack_Long(PStack pstack)
{
	return (pstack->stack_top) + 1;
}

bool Order_Stack_Push(PStack pstack,Data_Type* data)
{
	if (pstack->stack_top == Data_Size - 1) 
	{
		return false;
	}
	else
	{
		pstack->stack_top++;
		pstack->data[pstack->stack_top]=*data;  
		return true;
	}
}

bool Order_Stack_Pop(PStack pstack, Data_Type* data)
{
	if (pstack->stack_top==-1)
	{
		return false;
	}
	else
	{
		*data = pstack->data[pstack->stack_top];
		pstack->stack_top--;
		return true;
	}
}

void Order_Stack_Print(Stack_Order stack)
{
	int i;
	i = 0;
	while (i <=stack.stack_top)
	{
		Order_Stack_visit(stack.data[i++]);
	}
	printf("\n");
}

void Order_Stack_visit(Data_Type data)
{
	printf("%d ",data);
}

bool Order_Stack_GetTop(PStack pstack, Data_Type* data)
{
	if (pstack->stack_top == -1)
	{
		return false;
	}
	else
	{
		*data = pstack->data[pstack->stack_top];
		return true;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值