(C语言)判断表达式中括号是否匹配-洋葱先生-杨少通

注:本程序由Visual Studio 2015编写,与VC++6.0稍有区别,复制到VC++6.0注释掉“#include “stdafx.h””即可运行,复制到VS可直接运行。
#include “stdafx.h”

#include <stdio.h>

#include

#include <string.h>

using namespace std;

#define OK 1

#define ERROR 0

#define OVERFLOW -1

#define UNDERFLOW -2

#define STACK_INIT_SIZE 80

#define STACKINCREMENT 10

typedef int status;

#define ElemType char

typedef struct {

ElemType *base;

ElemType *top;

int stacksize;

}SqStack;

SqStack S;

status InitStack(SqStack &S) //初始化栈

{

S.base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));

if (!S.base)exit(OVERFLOW);

S.top = S.base;

S.stacksize = STACK_INIT_SIZE;

return OK;

}

status Push(SqStack &S, ElemType e) {//入栈

if (S.top-S.base == S.stacksize) {

	S.base = (ElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(ElemType));

	if (!S.base)exit(OVERFLOW);

	S.top = S.base + S.stacksize;

	S.stacksize += STACKINCREMENT;

}

*S.top++ = e;

return OK;

}

status Pop(SqStack &S, ElemType &e) {//出栈

if (S.top == S.base)exit(UNDERFLOW);

e = *(S.top=S.top-1);

return OK;

}

status StackEmpty(SqStack S) {//是否为空栈

return S.base == S.top;

}

status match(char exp[50]) {//括号是否匹配

InitStack(S);

ElemType e;

for (int i = 0; i < strlen(exp); i++) {

	switch (exp[i]) {

	case '(':

	case '[':

		Push(S, exp[i]);

		break;

	case ')':

		if (!StackEmpty(S))

		{

			Pop(S, e);

			if (e == '(')

				break;

			else

				return ERROR;

		}

		else

			return ERROR;

	case ']':

		if (!StackEmpty(S))

		{

			Pop(S, e);

			if (e == '[')

				break;

			else

				return ERROR;

		}

		else

			return ERROR;

	}

}

if (StackEmpty(S))

	return OK;

return ERROR;

}

int main() {

char exp[50];

cout << "\t\t\t\t*\t\t\t\t\t*";

cout << endl << "\t\t\t\t*\t计科1512-02210151232-杨少通\t*" << endl;

cout << "\t\t\t\t*****************************************" << endl << endl;

cout << "**************表达式括号是否匹配**************" << endl << endl;

cout << "   请输入表达式:";

cin >> exp;

if (match(exp))

	cout << "   表达式括号匹配!" << endl << endl;

else

	cout << "   表达式括号不匹配!" << endl << endl;

return 0;

}

本人初学数据结构,代码存在诸多问题,请各位看客多多指正。

如有转载请注明来源: www.dreamload.cn/blog/?p=238&preview=true (洋葱先生)

可以使用栈来判断表达式括号是否匹配。 具体实现步骤如下: 1. 定义一个栈结构,可以使用数组或链表实现。 2. 遍历表达式的每一个字符,如果是左括号('('、'{'、'['),则将其入栈。 3. 如果是右括号(')'、'}'、']'),则判断栈顶元素是否与其匹配,如果匹配,则将栈顶元素弹出,否则括号不匹配。 4. 最后判断栈是否为空,如果为空,则括号匹配,否则括号不匹配。 代码如下: ```c #include <stdio.h> #include <stdbool.h> #define MAX_STACK_SIZE 100 char stack[MAX_STACK_SIZE]; int top = -1; void push(char c) { if (top >= MAX_STACK_SIZE - 1) { printf("stack overflow!"); return; } stack[++top] = c; } char pop() { if (top < 0) { printf("stack underflow!"); return '\0'; } return stack[top--]; } char peek() { if (top < 0) { printf("stack underflow!"); return '\0'; } return stack[top]; } bool is_matching(char left, char right) { if (left == '(' && right == ')') return true; if (left == '{' && right == '}') return true; if (left == '[' && right == ']') return true; return false; } bool is_balanced(char* expr) { int i = 0; while (expr[i] != '\0') { if (expr[i] == '(' || expr[i] == '{' || expr[i] == '[') { push(expr[i]); } else if (expr[i] == ')' || expr[i] == '}' || expr[i] == ']') { if (is_matching(peek(), expr[i])) { pop(); } else { return false; } } i++; } return (top == -1); } int main() { char expr[MAX_STACK_SIZE]; printf("Enter an expression: "); scanf("%s", expr); if (is_balanced(expr)) { printf("The expression is balanced.\n"); } else { printf("The expression is not balanced.\n"); } return 0; } ``` 在上面的代码,我们使用了一个is_matching函数来判断左右括号是否匹配。is_balanced函数用来判断表达式括号是否匹配。如果表达式括号匹配,则is_balanced函数返回true,否则返回false。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值