队列是一种特殊的线性数据结构,它的特点是先进的元素先出,后进的元素后出,我们分别用顺序存储结构和链式存储结构来实现一个队列。
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();
}
链式存储结构相对线性结果,在空间利用率上提升了,但是时间复杂度高。