#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<malloc.h> #include<string.h>
#define MAXSIZE 2//定义栈空间的初始空间值
template<class element> class Stract//该栈主要采用顺序表的存储方式 { public: Stract() :_finish(0) , _capacity(MAXSIZE) , _array((element*)malloc(MAXSIZE*sizeof(element))) {}
void Reverse(element data)//当栈空间不足的时候会自动进行增容操作 { element* p = (element*)malloc((5 + MAXSIZE)*sizeof(element)); if (p)//开辟空间成功 { //1、现将原空间的内容拷贝到新空间里 //2、释放旧空间 //3、将旧空间赋值给_array //3、赋值,更改_finish,_capacity的值 strcpy(p, _array); free(_array); _array = p; _array[_finish] = data; _capacity = _capacity + 5; _finish = _finish + 1; } else { printf("Reverse::开辟空间失败!\n"); } }
void Push(element data)//进行入栈操作 { //如果栈空间满了,则自动进行扩容操作 if (_finish == _capacity) Reverse(data); else{ _array[_finish] = data; _finish = _finish + 1; } }
element Pop()//出栈 { //1、先判断栈是否为空 //2、如果栈为空就直接返回 //3、如果栈不为空则弹出最后一个元素 if (_finish) { _finish--; return _array[_finish]; } return 0; }
void Display()//打印栈空间的内容 { int i = 0; while (i < _finish) { char p = _array[i]; printf("%c", p); i++; } }
bool Empty()//判断栈是否为空,为空的话返回1,否则返回0 { return !_finish;//注意一定要加非号! }
private: element* _array;//栈空间 int _finish;//现在已经有的数量 int _capacity;//容量 };
bool LeftParenthesis(char arr)//判断是否为左括号 { return (arr == '{' || arr == '[' || arr == '('); }
bool RightParenthesis(char arr)//判断是否为右括号 { return (arr == '}' || arr == ']' || arr == ')'); }
bool Matching(char p1,char p2)//判断括号是否匹配 { if (p1 == '{'){ if (p2 == '}') return 1; return 0; } else if (p1 == '['){ if (p2 == ']') return 1; return 0; } else{ if (p2 == ')') return 1; return 0; } }
bool Test(Stract<char> s, char* arr)//测试函数 { if (arr == NULL) return 1; while (arr) { //1、如果接收到的字符是左括号则入栈进行下一个字符的获取 //2、如果接收到的字符是右括号则进行取栈顶操作,出栈的字符与接收到的字符进行匹配, // 如果是相同的则出栈,如果不同则返回0 //3、如果不是括号,不做任何处理,自动取下一个字符。 //4、当取完字符后判断栈是否为空,若为空则匹配成功,若不为空则说明还有左括号存在,则说明左括号多余。 if (LeftParenthesis(*arr)) s.Push(*arr); else if (RightParenthesis(*arr)){ if (s.Empty()){ printf("右括号多余!"); return 0; } else { char temp = s.Top(); if (Matching(temp, *arr)) s.Pop(); else return 0; } } else; arr++; } if (s.Empty()){ printf("左括号多余!\n"); return 0; } return 1;
}
int main() { Stract<char> s; char arr[] = "(ab)((d)"; char* p = arr; printf("%d",Test(s, arr)); return 0; }