注:
(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;
}
程序的运行结果
程序的运行结果正确!