用栈判断一个字符串是否平衡

注:
(1)本文定义:左符号:‘(’、‘[’、‘{’……
右符号:‘)’、‘]’、‘}’…….
(2)所谓的字符串的符号平衡,是指字符串中的左符号与右符号对应且相等,如字符串中的如‘(’等左符号与‘)’等右符号对应且相等,则称该字符串平衡。

程序的原理

该程序用栈来实现判断字符串是否平衡,遍历一个字符串,如遇到左符号(该程序只考虑三种符号:()、[]、{})‘(’、‘[’、‘{’,则入栈;遇到右符号‘)’、‘[’、‘}’,判断栈顶元素的左符号与右符号是否对应,如对应,则栈顶元素出栈。遍历完字符串后,如果栈为空,则该字符串平衡,否则不平衡。

程序的代码

头文件的代码:

#pragma once
#ifndef _STACKARRAY_H_
#define _STACKARRAY_H_
typedef char Elementtype;
#define MinStackSize 10
#define EmptyTOS -1
class Stack {
private:
	int Capacity;
	int TopOfStack;
	Elementtype* Array;
public:
	Stack();
	~Stack();
	bool Isempty() const;//判断栈是否为空
	bool Isfull() const;//判断栈是否满
	Stack(int MaxElements);//创建一个栈
	void Push(Elementtype X)  ;//进栈
	Elementtype  Top()  ;//返回栈顶的元素
	void Pop()  ;//出栈
};

#endif

头文件中相关函数的代码:

#include<iostream>
#include"StackArray.h"
using std::cout;
using std::endl;
Stack::Stack() {
	Capacity = 100;
	TopOfStack = -1;
	Array = new Elementtype[100 * sizeof(Elementtype)];
}
Stack::Stack(int MaxElements) {//创建一个栈
	if (MaxElements < MinStackSize)
		cout << "栈的空间大小小于给定的最小的栈的大小!" << endl;
	Array = new Elementtype[100 * sizeof(Elementtype)];
	if (Array == NULL)
		cout << "内存空间分配不成功!" << endl;
	else {
		Capacity = MaxElements;
		TopOfStack = -1;
	}
}
Stack::~Stack() {
	delete(Array);
}
bool Stack::Isempty() const {//判断栈是否为空
	return TopOfStack == EmptyTOS;
}
bool Stack::Isfull() const {//判断栈是否满
	return TopOfStack >= Capacity;
}
void Stack::Push(Elementtype X)   {//进栈
	if (Isfull())
		cout << "栈空间已满!" << endl;
	else {
		++TopOfStack;
		Array[TopOfStack] = X;
		
	}
}
Elementtype  Stack::Top()   {//返回栈顶的元素
	if (!Isempty())
		return Array[TopOfStack];
	else {
		cout << "该栈为空,不可以进行访问!" << endl;
		return 0;
	}

}
void Stack::Pop()   {//出栈
	if (Isempty())
		cout << "该空栈为空,不可以进行出栈操作!" << endl;
	else
		TopOfStack--;
}

主程序的代码:

//该程序用栈来实现判断一个字符串是否平衡

#include<iostream>
#include"StackArray.h"
int main() {
	using namespace std;
	const char* p1 = "a+(b+c*d)-{e%a-[f^3+(h*8/6+7)*12]+56}";
	string p2 = "1+{2*3+5*[3+6^5+(45*2+8)]+89}-[4*9+(";
	Stack S;
	Stack& s = S;
	//判断表达式p1是否平衡
	for (int i = 0; p1[i] != '\0'; i++) {
		if (p1[i] == '(' || p1[i] == '[' || p1[i] == '{')
			S.Push(p1[i]);
		if (p1[i] == ')' && S.Top() == '(' || p1[i] == ']' && S.Top() == '[' || p1[i] == '}' && S.Top() == '{')
			S.Pop();
	}
	if (S.Isempty())
		cout << "表达式p1的符号平衡!" << endl;
	else
		cout << "表达式p1的符号不平衡!" << endl;
	//判断表达式p2是否平衡
	for (int i = 0; p2[i] != '\0'; i++) {
		if (p2[i] == '(' || p2[i] == '[' || p2[i] == '{')
			S.Push(p2[i]);
		if (p2[i] == ')' && S.Top() == '(' || p2[i] == ']' && S.Top() == '[' || p2[i] == '}' && S.Top() == '{')
			S.Pop();
	}
	if (S.Isempty())
		cout << "表达式p2的符号平衡!" << endl;
	else
		cout << "表达式p2的符号不平衡!" << endl;
	return 0;
}



程序的运行结果

在这里插入图片描述
程序的运行结果正确!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值