数据结构学习笔记(2)栈的c++应用--括号匹配的检验

括号匹配的检验来自于严薇敏数据结构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");

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值