1. 程式人生 > >資料結構——棧——括號匹配(c++)

資料結構——棧——括號匹配(c++)

同樣是用棧模板寫的,實現上比慕課網上講的簡單一些,沒有定義兩個棧,而是直接判斷是否是左括號,是的話就在MyStack中push另一半括號;如果是右括號且又不是需要的括號,就直接列印不匹配,如果是需要的右括號,就pop掉左括號。最後看mystack中棧頂是否為0,為0則列印括號匹配。


程式碼如下,寫的不好還請大家指出共同討論

demo.cpp

#include <iostream>
#include "MyStack.h"
using namespace std;

int main(void)
{
	MyStack<char> *pStack = new MyStack<char>(30);
	char *ch, x;
	int i,flag=1;
	ch = new char[30];
	cin >> ch;
	char elem;
	int length = strlen(ch);
	for (i = 0; i < length; i++)
	{
		if (ch[i] == '(' || ch[i] == '[')
		{
			pStack->push(ch[i]);
		}
		else if (ch[i] == ')')
		{
			 pStack->pop(ch[i]);
			if (ch[i] != '(')
			{
				cout << "括號不匹配" << endl;
				flag = 0;
			}
		}
		else if (ch[i] == ']')
		{
			elem = pStack->pop(ch[i]);
			if (ch[i] != '[')
			{
				cout << "括號不匹配" << endl;
				flag = 0;
			}
		}
	}
	if (pStack->stackLength() != 0)
	{
		cout << "括號數量不匹配" << endl;
		flag = 0;
	}
	if (flag == 1)
		cout << "括號匹配" << endl;
	
}

MyStack.h
#pragma once
#include "MyStack.h"
#include <iostream>
using namespace std;

template <typename T>
class MyStack
{
public:
	MyStack(int size);  //分配記憶體初始化棧空間,設定棧容量,棧頂
	~MyStack();         //回收棧空間記憶體
	bool stackEmpty();  //判斷棧是否為空,為空返回true,非空返回false
	bool stackFull();   //判斷棧是否已滿,已滿返回true,不滿返回false
	void clearStack();  //清空棧
	int stackLength();  //已有元素的個數
	bool push(T elem);//元素入棧,棧頂上升
	bool pop(T &elem);//元素出棧,棧頂下降
	void stackTravers(); //遍歷棧中所有元素

private:
	T *m_stack;     //棧空間指標
	int m_iSize;       //棧容量
	int m_iTop;        //棧頂,棧中元素數量  
};




template <typename T>//每一個函式前面都要加


MyStack<T>::MyStack(int size)
{
	m_iSize = size;
	m_stack = new T[size];
	m_iTop = 0;//當前的棧是一個空棧,空棧,棧頂為零
}
template <typename T>
MyStack<T>::~MyStack()
{
	delete[]m_stack;//釋放陣列的記憶體
}
template <typename T>
bool MyStack<T>::stackEmpty()
{
	if (0 == m_iTop)//更加高質量
	{
		return true;
	}
	return false;
}
template <typename T>
bool MyStack<T>::stackFull()
{
	if (m_iTop == m_iSize)//寫成>=一樣
	{
		return true;
	}
	return false;
}
template <typename T>
void MyStack<T>::clearStack()
{
	m_iTop = 0;//令棧頂復原,就算原來的棧裡有值,下一次賦值也會進行覆蓋

}
template <typename T>
int MyStack<T>::stackLength()
{
	return m_iTop;
}
template <typename T>
bool MyStack<T>::push(T elem)//一定要放在棧頂
{
	if (stackFull())
	{
		//可以用throw來丟擲異常
		return false;
	}
	m_stack[m_iTop] = elem;
	m_iTop++;//此時棧頂指向的是一個空位置
	return true;

}
template <typename T>
bool MyStack<T>::pop(T &elem)//傳入的是一個引用
{
	if (stackEmpty())
	{
		return false;
	}
	m_iTop--;//將棧頂降低至實際的棧頂
	elem = m_stack[m_iTop];
	return true;
}


//void MyStack::stackTravers(visit())複雜的棧需要一個函式做指標來遍歷
template <typename T>
void MyStack<T>::stackTravers()
{

	for (int i = 0; i < m_iTop; i++)
	{
		//m_stack[i].Coorprint();
		cout << m_stack[i];
	}
}