几种形式队列的实现

      队列是一种特殊的线性数据结构,它的特点是先进的元素先出,后进的元素后出,我们分别用顺序存储结构和链式存储结构来实现一个队列

1.循环队列

template< class T>
class Stack
{
public:
	Stack()
		:_array(new T[3])
		, _size(0)
		, _capacity(3)
	{}
	void Push(const T& data)
	{
		_Checkcapacity();
		_array[_size++] = data;

	}
	void Pop()
	{
		_size--;
	}

	bool Empty()
	{
		if (_size == 0)
			return true;
		return false;
	}
	T& Top()
	{
		return _array[_size-1];
	}
	T& Top()const
	{
		return _array[_size - 1];
	}
	size_t  Size()
	{
		return _size;
	}
	size_t Capacity()
	{
		return _capacity;
	}
	void  _Checkcapacity()
	{
		if (_size >= _capacity)
		{
			T* newarray = new T[_size * 2 + 3];
			for (int i = 0; i < _size; i++)
			{
				newarray[i] = _array[i];
			}
			_capacity = _size * 2 + 3;
			delete _array;
			_array = newarray;
		}
		 
	}
	~Stack()
	{
		if (_array)
			delete _array;
		_array = NULL;
		_size = 0;
		_capacity = 0;
	}
private:
	T * _array;
	int _size;
	int _capacity;
};
bool MatchBrackets(char* c,int size)
{
	Stack ch;
	for (int i = 0; i < size; i++)
	{
		if (c[i] == '(' || c[i] == '{' || c[i] == '[')
		{
			ch.Push(c[i]);
			continue;
		}
		else if (c[i] == ')' || c[i] == ']' || c[i] == '}')
		{
			if (ch.Empty())
			{
				cout << "右括号多于左括号" << endl;
				return true;
			}
			else
			{
				if ((c[i]==')'&&ch.Top()=='(')||(c[i] == ']'&&ch.Top() == '[')|| (c[i] == '}'&&ch.Top() == '{'))
				{
					ch.Pop();
					continue;
				}
				else {
					cout << "左右括号匹配次序不正确" << endl;
					return false;
				}
			}


		}
		else {
			continue;
		}
	}
	if (ch.Empty())
	{
		cout << "匹配正确" << endl;
		return true;
	}
	else {
		cout << " 左括号多于右括号" << endl;
		return false;
	}


}
enum op { OPERAND,OPERATOR, ADD, SUB, MUL, DIV };
typedef struct Cell{
	op _op;
	int data;
	 
}Cell;
int RPN(Cell*s, int		size)
{
	Stack c;
	for (int i = 0; i < size; i++)
	{
		if (s[i]._op == OPERAND)
		{
			c.Push(s[i].data);
			continue;
		}
		else if (s[i]._op == OPERATOR)
		{
			int right = c.Top();
			c.Pop();
			int left = c.Top();
			c.Pop();
			switch (s[i].data)
			{
			case ADD:
				c.Push(left + right);
				break;
			case SUB:
				c.Push(left - right);
				break;
			case MUL:
				c.Push(left*right);
				break;
			case DIV:
				assert(right != 0);
				c.Push(left / right);
				break;
				
			default:
				assert(0);
				break;
			}

		}
	}


	   c.Top();
}

这种方法少用了一个存储单元来分辨队满和队空的情况。

2.设置一个flag

template< class T>
class Stack
{
public:
	Stack()
		:_array(new T[3])
		, _size(0)
		, _capacity(3)
	{}
	void Push(const T& data)
	{
		_Checkcapacity();
		_array[_size++] = data;

	}
	void Pop()
	{
		_size--;
	}

	bool Empty()
	{
		if (_size == 0)
			return true;
		return false;
	}
	T& Top()
	{
		return _array[_size-1];
	}
	T& Top()const
	{
		return _array[_size - 1];
	}
	size_t  Size()
	{
		return _size;
	}
	size_t Capacity()
	{
		return _capacity;
	}
	void  _Checkcapacity()
	{
		if (_size >= _capacity)
		{
			T* newarray = new T[_size * 2 + 3];
			for (int i = 0; i < _size; i++)
			{
				newarray[i] = _array[i];
			}
			_capacity = _size * 2 + 3;
			delete _array;
			_array = newarray;
		}
		 
	}
	~Stack()
	{
		if (_array)
			delete _array;
		_array = NULL;
		_size = 0;
		_capacity = 0;
	}
private:
	T * _array;
	int _size;
	int _capacity;
};
bool MatchBrackets(char* c,int size)
{
	Stack ch;
	for (int i = 0; i < size; i++)
	{
		if (c[i] == '(' || c[i] == '{' || c[i] == '[')
		{
			ch.Push(c[i]);
			continue;
		}
		else if (c[i] == ')' || c[i] == ']' || c[i] == '}')
		{
			if (ch.Empty())
			{
				cout << "右括号多于左括号" << endl;
				return true;
			}
			else
			{
				if ((c[i]==')'&&ch.Top()=='(')||(c[i] == ']'&&ch.Top() == '[')|| (c[i] == '}'&&ch.Top() == '{'))
				{
					ch.Pop();
					continue;
				}
				else {
					cout << "左右括号匹配次序不正确" << endl;
					return false;
				}
			}


		}
		else {
			continue;
		}
	}
	if (ch.Empty())
	{
		cout << "匹配正确" << endl;
		return true;
	}
	else {
		cout << " 左括号多于右括号" << endl;
		return false;
	}


}
enum op { OPERAND,OPERATOR, ADD, SUB, MUL, DIV };
typedef struct Cell{
	op _op;
	int data;
	 
}Cell;
int RPN(Cell*s, int		size)
{
	Stack c;
	for (int i = 0; i < size; i++)
	{
		if (s[i]._op == OPERAND)
		{
			c.Push(s[i].data);
			continue;
		}
		else if (s[i]._op == OPERATOR)
		{
			int right = c.Top();
			c.Pop();
			int left = c.Top();
			c.Pop();
			switch (s[i].data)
			{
			case ADD:
				c.Push(left + right);
				break;
			case SUB:
				c.Push(left - right);
				break;
			case MUL:
				c.Push(left*right);
				break;
			case DIV:
				assert(right != 0);
				c.Push(left / right);
				break;
				
			default:
				assert(0);
				break;
			}

		}
	}


	   c.Top();
}

3.设置一个计数器

template< class T>
class Stack
{
public:
	Stack()
		:_array(new T[3])
		, _size(0)
		, _capacity(3)
	{}
	void Push(const T& data)
	{
		_Checkcapacity();
		_array[_size++] = data;

	}
	void Pop()
	{
		_size--;
	}

	bool Empty()
	{
		if (_size == 0)
			return true;
		return false;
	}
	T& Top()
	{
		return _array[_size-1];
	}
	T& Top()const
	{
		return _array[_size - 1];
	}
	size_t  Size()
	{
		return _size;
	}
	size_t Capacity()
	{
		return _capacity;
	}
	void  _Checkcapacity()
	{
		if (_size >= _capacity)
		{
			T* newarray = new T[_size * 2 + 3];
			for (int i = 0; i < _size; i++)
			{
				newarray[i] = _array[i];
			}
			_capacity = _size * 2 + 3;
			delete _array;
			_array = newarray;
		}
		 
	}
	~Stack()
	{
		if (_array)
			delete _array;
		_array = NULL;
		_size = 0;
		_capacity = 0;
	}
private:
	T * _array;
	int _size;
	int _capacity;
};
bool MatchBrackets(char* c,int size)
{
	Stack ch;
	for (int i = 0; i < size; i++)
	{
		if (c[i] == '(' || c[i] == '{' || c[i] == '[')
		{
			ch.Push(c[i]);
			continue;
		}
		else if (c[i] == ')' || c[i] == ']' || c[i] == '}')
		{
			if (ch.Empty())
			{
				cout << "右括号多于左括号" << endl;
				return true;
			}
			else
			{
				if ((c[i]==')'&&ch.Top()=='(')||(c[i] == ']'&&ch.Top() == '[')|| (c[i] == '}'&&ch.Top() == '{'))
				{
					ch.Pop();
					continue;
				}
				else {
					cout << "左右括号匹配次序不正确" << endl;
					return false;
				}
			}


		}
		else {
			continue;
		}
	}
	if (ch.Empty())
	{
		cout << "匹配正确" << endl;
		return true;
	}
	else {
		cout << " 左括号多于右括号" << endl;
		return false;
	}


}
enum op { OPERAND,OPERATOR, ADD, SUB, MUL, DIV };
typedef struct Cell{
	op _op;
	int data;
	 
}Cell;
int RPN(Cell*s, int		size)
{
	Stack c;
	for (int i = 0; i < size; i++)
	{
		if (s[i]._op == OPERAND)
		{
			c.Push(s[i].data);
			continue;
		}
		else if (s[i]._op == OPERATOR)
		{
			int right = c.Top();
			c.Pop();
			int left = c.Top();
			c.Pop();
			switch (s[i].data)
			{
			case ADD:
				c.Push(left + right);
				break;
			case SUB:
				c.Push(left - right);
				break;
			case MUL:
				c.Push(left*right);
				break;
			case DIV:
				assert(right != 0);
				c.Push(left / right);
				break;
				
			default:
				assert(0);
				break;
			}

		}
	}


	   c.Top();
}

接下来我们用链式存储的结构来实现

template< class T>
class Stack
{
public:
	Stack()
		:_array(new T[3])
		, _size(0)
		, _capacity(3)
	{}
	void Push(const T& data)
	{
		_Checkcapacity();
		_array[_size++] = data;

	}
	void Pop()
	{
		_size--;
	}

	bool Empty()
	{
		if (_size == 0)
			return true;
		return false;
	}
	T& Top()
	{
		return _array[_size-1];
	}
	T& Top()const
	{
		return _array[_size - 1];
	}
	size_t  Size()
	{
		return _size;
	}
	size_t Capacity()
	{
		return _capacity;
	}
	void  _Checkcapacity()
	{
		if (_size >= _capacity)
		{
			T* newarray = new T[_size * 2 + 3];
			for (int i = 0; i < _size; i++)
			{
				newarray[i] = _array[i];
			}
			_capacity = _size * 2 + 3;
			delete _array;
			_array = newarray;
		}
		 
	}
	~Stack()
	{
		if (_array)
			delete _array;
		_array = NULL;
		_size = 0;
		_capacity = 0;
	}
private:
	T * _array;
	int _size;
	int _capacity;
};
bool MatchBrackets(char* c,int size)
{
	Stack ch;
	for (int i = 0; i < size; i++)
	{
		if (c[i] == '(' || c[i] == '{' || c[i] == '[')
		{
			ch.Push(c[i]);
			continue;
		}
		else if (c[i] == ')' || c[i] == ']' || c[i] == '}')
		{
			if (ch.Empty())
			{
				cout << "右括号多于左括号" << endl;
				return true;
			}
			else
			{
				if ((c[i]==')'&&ch.Top()=='(')||(c[i] == ']'&&ch.Top() == '[')|| (c[i] == '}'&&ch.Top() == '{'))
				{
					ch.Pop();
					continue;
				}
				else {
					cout << "左右括号匹配次序不正确" << endl;
					return false;
				}
			}


		}
		else {
			continue;
		}
	}
	if (ch.Empty())
	{
		cout << "匹配正确" << endl;
		return true;
	}
	else {
		cout << " 左括号多于右括号" << endl;
		return false;
	}


}
enum op { OPERAND,OPERATOR, ADD, SUB, MUL, DIV };
typedef struct Cell{
	op _op;
	int data;
	 
}Cell;
int RPN(Cell*s, int		size)
{
	Stack c;
	for (int i = 0; i < size; i++)
	{
		if (s[i]._op == OPERAND)
		{
			c.Push(s[i].data);
			continue;
		}
		else if (s[i]._op == OPERATOR)
		{
			int right = c.Top();
			c.Pop();
			int left = c.Top();
			c.Pop();
			switch (s[i].data)
			{
			case ADD:
				c.Push(left + right);
				break;
			case SUB:
				c.Push(left - right);
				break;
			case MUL:
				c.Push(left*right);
				break;
			case DIV:
				assert(right != 0);
				c.Push(left / right);
				break;
				
			default:
				assert(0);
				break;
			}

		}
	}


	   c.Top();
}
链式存储结构相对线性结果,在空间利用率上提升了,但是时间复杂度高。



你可能感兴趣的:(c++)