c++和c语言实现括号就进匹配

       利用栈的特性来实现左右括号就进匹配是栈的一个典型应用。遍历字符串,配合遍历情况来进行入栈出栈操作然后判断栈内元素个数就可以完成判断,可以在遍历时记录遍历到的位置,并且给每个入栈元素记录位置,这样就可以在得出结果后指出不匹配的左右括号位置。在使用c语言完成时,用到了自己编写的栈,在使用c++编写时,直接使用STL。

main.cpp

#include<iostream>
#include<stack>
#include<string>
using  namespace std;

bool isLeft(const char* p)
{
	return *p == '(';
}

bool isRight(const char* p)
{
	return *p == ')';
}

void PrintfError(string str, int index)
{
	cout << str << endl;
	for (int i = 0; i < index; i++)
	{
		cout << " ";
	}
	cout << 'A' << endl;
}

int main()
{
    string str = "123(4asfjh)((fgws)";

	stack<pair<const char*,int>>s;
	int index = 0;
	
	const char* p = str.c_str();
	while (*p != '\0')
	{
		//左括号入栈
		if (isLeft(p))
		{
			s.push(make_pair(p,index));
		}

		//右括号出栈
		if (isRight(p))
		{
			if (!s.empty())
			{
				if (isLeft(s.top().first))
				{
					s.pop();
				}
			}
			else
			{
				cout << "右括号没有匹配的左括号" << endl;
				PrintfError(str, index);
			}
		}
		p++;
		index++;
	}

	while (s.size() > 0)
	{
		cout << "左括号没有匹配的右括号" << endl;
		PrintfError(str, s.top().second);
		break;
	}

	system("pause");
	return 0;
}

main.c

#define _crt_secure_no_warnings
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "linkstack.h"

typedef struct mychar
{
	LinkNode node;
	char* pAddres;
	int index;

}MyChar;

int IsLeft(char c)
{
	return c == '(';
}

int IsRight(char c)
{
	return c == ')';
}

MyChar* CreatMychar(char* p, int index)
{
	MyChar* mychar = (MyChar*)malloc(sizeof(MyChar));
	mychar->pAddres = p;
	mychar->index = index;
	return mychar;
}

void ShowError(char* str, int pos)
{
	printf("%s\n", str);
	for (int i = 0; i < pos; i++)
	{
		printf(" ");
	}
	printf("A");
}

int main()
{
	//3+5*(7+4)+(
	//扫描字符串,如果碰到左括号,直接入栈
    //如果碰到右括号,从栈顶弹出括号,判断是否是左括号,如果是匹配成功。
	 char* str = "ojahos(jd)askd12(()";
	 char* p = str;
	 int index = 0;
	 
	 //创建栈容器
	 LinkStack* stack = Init_LinkStack();

	 while (*p != '\0')
	 {
		 //如果是左括号直接进栈

		 //printf("*p %c ");

		 if (IsLeft(*p))
		 {
			 //printf("%c", *p);
			 Push_LinkStack(stack, (LinkNode*)CreatMychar(p,index));
		 }

		 //如果是右括号,从栈顶弹出元素,判断是不是左括号

		 if (IsRight(*p))
		 { 
			 if (Size_LinkStack(stack) > 0)
			 {
				 MyChar* mychar = (MyChar*)Top_LinkStack(stack);

				 if (IsLeft(*(mychar->pAddres)))
				 {
					 Pop_LinkStack(stack);
					 free(mychar);
				 }
			 }

			 else
			 {
				 printf("右括号没有匹配的左括号:\n");
				 ShowError(str, index);
				 break;
			 }
		 }
		 p++;
		 index++;
	 }

	 while (Size_LinkStack(stack) > 0)
	 {
		 MyChar* mychar = (MyChar*)Top_LinkStack(stack);
		 printf("左括号没有匹配的右括号:\n");
		 ShowError(str, mychar->index);
		 Pop_LinkStack(stack);
		 free(mychar);
		 break;
	 }

	system("pause");
	return 0;
}

测试结果:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值