括号匹配的检验来自于严薇敏数据结构3.2节的3.2.2留下的的习题
实现代码如下:ps:存在的问题:当每次给getchar值之后,会打印两次"请输入:" 如果您在看这篇文章 碰巧知道我的问题所在之处,还请不吝指教!
#include"type.h"//定义的ERROR、OK等
#include <string>
#define STACK_INIT_SIZE 100
#define STCAK_INCREASMENT 10
using namespace std;
template <class type>
class stack {
private:
type * base;//栈底
type * top;//栈顶
int stacksize;//当前已分配的存储空间,以元素为单位
public:
stack() :base(NULL), top(NULL) {}
Status InitStack() {
//分配一个空栈
base = new type[STACK_INIT_SIZE];
if (base == NULL)return ERROR;
top = base;
stacksize = STACK_INIT_SIZE;
return OK;
}
Status GetTop(type &e) {
//若栈不为空栈,那么返回栈顶元素
if (base == top)return ERROR;
e = *(top-1);//因为top指的是最后一个元素的下一个元素
return OK;
}
Status Push(type e) {
if (top == NULL) {//栈满
type * newbase = NULL;
newbase = new type [(STCAK_INCREASMENT+STACK_INIT_SIZE)];
if (newbase == NULL) return ERROR;
memcpy(newbase, base, stacksize * sizeof(type));
delete[] base;
base = newbase;
stacksize += STCAK_INCREASMENT;
}
*(top++) = e;
return OK;
}
Status Pop(type &e) {
if (base == top) return ERROR;
e = *(--top);
return OK;
}
Status PrintStack() {
if (base == top) return ERROR;
type * p = base;
while (p != top) {
cout << *p << ",";
p++;
}
cout << endl;
}
Status ClearStack() {
if (base == top) return OK;
type tmp;
while (base != top) {
Pop(tmp);
}
if (base == top) return OK;
else return ERROR;
}
Status IsEmpty() {
if (base == top) return TRUE;
else return FALSE;
}
};
int main() {
stack<int> my_stack;
my_stack.InitStack();
for (int i = 0; i < 100; i++)
{
my_stack.Push(i);
}
cout << "初始化的值为:" << endl;
my_stack.PrintStack();
/*-----------------------*/
/*---测试能否分配内存---*/
/*-----------------------*/
my_stack.Push(111);
my_stack.Push(222);
cout << "分配内存后值为:" << endl;
my_stack.PrintStack();
/*-----------------------*/
/*---测试能否pop出去---*/
/*-----------------------*/
int get_value[100];
for (int i = 0; i < 20; i++)
{
my_stack.Pop(get_value[i]);
}
cout << "pop出20个元素之后值为:" << endl;
my_stack.PrintStack();
/*-----------------------*/
/*---清空栈---*/
/*-----------------------*/
my_stack.ClearStack();
/*-----------------------*/
/*---括号匹配的检验---*/
/*-----------------------*/
stack<char> my_stack_kuohao;
my_stack_kuohao.InitStack();
char val;//键盘值
char topval;//栈顶值
bool flag=0;//第一次输入的标志位
cout << "括号匹配的检验:" << endl;
while (1)
{
cout << "请输入:" << endl;
val = getchar();
while (val == ']' || val == ')') {
if (flag == 0) {
cout << val << "输入错误,请重新输入:" << endl;
val = 0;
}
else {
my_stack_kuohao.GetTop(topval);
cout << "Topvalue =:" << topval << endl;
if (topval == '(') {
if (val == ']') {
cout << "输入不匹配"<< endl;
system("pause");
return ERROR;
}
if (val == ')') {
char bin;
my_stack_kuohao.Pop(bin);
cout << bin << "出栈" << endl;
my_stack_kuohao.PrintStack();
}
}
if (topval == '[') {
if (val == ')') {
cout << "输入不匹配" << endl;
system("pause");
return ERROR;
}
if (val == ']') {
char bin;
my_stack_kuohao.Pop(bin);
cout << bin << "出栈" << endl;
my_stack_kuohao.PrintStack();
}
}
val = 0;
topval = 0;
if (my_stack_kuohao.IsEmpty() == 1) {
flag = 0;
}
}
}
while (val == '(' || val == '[') {
my_stack_kuohao.Push(val);
cout << val<< "入栈" << endl;
my_stack_kuohao.PrintStack();
flag = 1;
val = 0;
}
}
system("pause");
}