10数据结构— 栈的应用就近匹配(括号)

思路:

设定规则,碰到左括号入栈,在这基础上,遇到右括号出栈,如一直遇不到右括号,则左括号不匹配。如果栈上没有左括号,遇到右括号,即右括号不匹配。判断栈上有没有元素的重要条件为栈的大小。即最后栈上有元素,则可以说明左括号不匹配。栈上没有元素,也不是右括号匹配的情况的话,即最后结果为括号匹配。

代码实现:

头文件.h

#pragma once
#include <iostream>
using namespace std;
//运用企业链表构建
typedef struct SNode {
	struct SNode* next;

}Snode;

typedef struct LinkStack {
	int size;
	Snode head;//小挂钩
}Lstack;
//初始化
Lstack* init_Lstack();
//增加
void push_Lstack(Lstack* Lsta, Snode* data);
//删除
void pop_Lstack(Lstack* Lsta);
//返回栈顶元素
Snode* Top_Lstack(Lstack* Lsta);
//摧毁内存
void free_Lstack(Lstack* Lsta);
//返回栈的大小
int Size_Lstack(Lstack* Lsta);

.cpp文件

#include "Selink_stack.h"

Lstack* init_Lstack()
{
    Lstack* lsta = (Lstack*)malloc(sizeof(Lstack));
    lsta->size = 0;
    lsta->head.next = NULL;
    return lsta;
}

void push_Lstack(Lstack* Lsta, Snode* data)
{
    if (Lsta == NULL) {
        cout << "链表未被创建!" << endl;
    }
    data->next = Lsta->head.next;
    Lsta->head.next = data;
    Lsta->size++;
}

void pop_Lstack(Lstack* Lsta)
{
    if (Lsta == NULL) {
        cout << "链表未被创建!" << endl;
    }
    Snode* first = Lsta->head.next;
    Lsta->head.next = first->next;
    Lsta->size--;
}

Snode* Top_Lstack(Lstack* Lsta)
{
    return Lsta->head.next;
}

void free_Lstack(Lstack* Lsta)
{
    if (Lsta == NULL) {
        cout << "链表未被创建!" << endl;
    }
    free(Lsta);
    cout << "链表已被摧毁!" << endl;
}

int Size_Lstack(Lstack* Lsta)
{
    return Lsta->size;
}

主函数测试文件

#include "Selink_stack.h"
typedef struct Mychar {
	Snode node;
	int size;
	char* addr;
}mychar;
bool isLeft(char p) {
	return p == '(';
}
bool isright(char p) {
	return p == ')';
}
mychar* into(char *p,int index) {//即将要放入栈的左括号信息
	mychar* my = (mychar*)malloc(sizeof(mychar));
	my->addr = p;
	my->size = index;
	return my;
}
void showerror(char *str,int num) {//显示哪里出错
	cout<<str<<endl;
	for (int i = 0;i<num;i++) {
		cout << " ";
	}
	cout<<"A" << endl;
}
int main() {
	int index=0,pos=-1;
	Lstack* lst =init_Lstack();
	char str[] = "1+(2+)2+3)+(+0=";
	char* p;
	p = str;
	//*p为单个字符
	while (*p!='\0') {
	//如果碰到左括号,入栈
		if (isLeft(*p)) {
			push_Lstack(lst,(Snode*)into(p,index));
		}
		//cout <<*p<<":" << lst->size << endl;
		//如果碰到右括号
		if (isright(*p)) {
			if (lst->size > 0) {//代表有左括号 要出栈
				pop_Lstack(lst);
				//cout << "右"<<lst->size << endl;
				pos = index;
			}
			else {//代表栈中无元素 
				showerror(str,index);
				cout<<"右括号没有匹配的左括号!" << endl;
				pos = 1;
			}
		
		}

		index++;
		p++;
	}
	//cout<<lst->size<<endl;
	if (lst->size > 0) {
		mychar* myc = (Mychar*)Top_Lstack(lst);
		showerror(str,myc->size);
		cout << "左括号没有匹配的右括号!" << endl;
	}
	if (lst->size == 0&&pos==-1) {
		cout<<"括号匹配!" << endl;
	}

	return 0;
}

运行效果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值