@这篇文档是由C++代码实现的栈,并对以栈为基础的括号匹配、进制转换等问题进行了解决
栈是一种后进先出的数据结构。其中生活中以摞盘子为例最为实际。本文是以Visual Studio中新建的C++win32的控制台应用程序实现的,其中建立了头文件和源文件以及实现main()的demo文件,分别是MyStack.h和MyStack.cpp和demo.cpp,以及Coordinate.h和Coordinate.cpp文件。
其中MyStack.h和MyStack.cpp文件是建立一个栈的模板类,方便以后调用其中的函数。Coordinate.h和Coordinate.cpp文件主要是建立一个坐标属性的类,方便将该数据类型赋值给栈的模板类,以存放具有坐标属性的栈。demo中主要利用模板栈类实现了坐标类存入栈中、以及进制转换和浮点型类型数据等存放入栈中。
MyStack.h文件
#ifndef
MYSTACK_H
#define
MYSTACK_H
template
<typename
T>
class MyStack
{
public:
MyStack(int length
);
virtual
~MyStack();
int
MyStackLen();
bool
MyStackEmpty();
bool
MyStackFull();
void ClearMyStack();
bool
InsertElement(T element
);
bool
DeleteElement(T &element
);
bool
TraversalMyStack();
private:
T* m_tMyStack
;
int m_iMyStackLength
;
int m_iMyStackCapacity
;
int m_iTos
;
};
#endif
MyStack.cpp
#include
"MyStack.h"
#include
<iostream
>
using namespace std
;
template
<typename
T>
MyStack
<T>::MyStack(int length
)
{
m_iMyStackCapacity
= length
;
m_tMyStack
= new T[m_iMyStackCapacity
];
ClearMyStack();
}
template
<typename
T>
MyStack
<T>::~MyStack()
{
delete []m_tMyStack
;
m_tMyStack
= NULL;
}
template
<typename
T>
int MyStack
<T>::MyStackLen()
{
return m_iMyStackLength
;
}
template
<typename
T>
bool MyStack
<T>::MyStackEmpty()
{
return m_iTos
== 0?true:false;
}
template
<typename
T>
bool MyStack
<T>::MyStackFull()
{
return m_iTos
== m_iMyStackCapacity
?true:false;
}
template
<typename
T>
void MyStack
<T>::ClearMyStack()
{
m_iMyStackLength
= 0;
m_iTos
= 0;
}
template
<typename
T>
bool MyStack
<T>::InsertElement(T element
)
{
if(MyStackFull())
{
cout
<< "该栈已满,不能再插入新的元素!" << endl
;
return false;
}
else
{
m_tMyStack
[m_iTos
] = element
;
m_iTos
++;
m_iMyStackLength
++;
return true;
}
}
template
<typename
T>
bool MyStack
<T>::DeleteElement(T &element
)
{
if(MyStackEmpty())
{
return false;
}
else
{
m_iTos
--;
element
= m_tMyStack
[m_iTos
];
m_iMyStackLength
--;
return true;
}
}
template
<typename
T>
bool MyStack
<T>::TraversalMyStack()
{
if(MyStackEmpty())
{
return false;
}
else
{
for(int i
=(m_iTos
-1);i
>=0; i
--)
{
cout
<< m_tMyStack
[i
];
}
return true;
}
}
demo.cpp文件
#include
<iostream
>
#include
"MyStack.h"
#include
"MyStack.cpp"
#include
"Coordinate.h"
using namespace std
;
int
main(void)
{
MyStack
<char
> *pHaveStack
= new MyStack<char
>(100);
MyStack
<char
> *pNeedStack
= new MyStack<char
>(50);
char strbrackets
[] = "[][][][][]}";
char currentNeed
= 0;
for (int i
=0; i
<strlen(strbrackets
);i
++)
{
if (strbrackets
[i
] != currentNeed
)
{
switch(strbrackets
[i
])
{
case '{':
pHaveStack
->InsertElement(strbrackets
[i
]);
if (currentNeed
!=0)
{
pNeedStack
->InsertElement(currentNeed
);
}
currentNeed
= '}';
break;
case '[':
pHaveStack
->InsertElement(strbrackets
[i
]);
if (currentNeed
!=0)
{
pNeedStack
->InsertElement(currentNeed
);
}
currentNeed
= ']';
break;
case '(':
pHaveStack
->InsertElement(strbrackets
[i
]);
if (currentNeed
!=0)
{
pNeedStack
->InsertElement(currentNeed
);
}
currentNeed
= ')';
break;
default:
cout
<< "字符串匹配不成功!" << endl
;
system("pause");
return 0;
}
}
else
{
char e
;
pHaveStack
->DeleteElement(e
);
if (!pNeedStack
->DeleteElement(currentNeed
))
{
currentNeed
= 0;
}
}
}
if (pNeedStack
->MyStackEmpty())
{
cout
<< "字符串匹配成功!" << endl
;
}
else
{
cout
<< "字符串匹配不成功!" << endl
;
}
delete []pHaveStack
;
pHaveStack
= NULL;
delete []pNeedStack
;
pNeedStack
= NULL;
system("pause");
return 0;
}
Coordinate.h文件:主要实现了坐标类和<<操作符重载,而且是友元函数实现的操作符重载。
#ifndef
COORDINATE_H
#define
COORDINATE_H
#include
<iostream
>
using namespace std
;
class Coordinate
{
public:
Coordinate(int x
=0, int y
=0);
void printCoordinate();
friend ostream
&operator
<<(ostream
&output
,Coordinate
&coor
);
private:
int m_iX
;
int m_iY
;
};
#endif
Coordinate.cpp文件
#include
"Coordinate.h"
#include
<iostream
>
using namespace std
;
Coordinate
::Coordinate(int x
, int y
)
{
m_iX
= x
;
m_iY
= y
;
}
void Coordinate
::printCoordinate()
{
cout
<< "(" << m_iX
<< "," << m_iY
<< ")" <<endl
;
}
ostream
&operator
<<(ostream
&output
,Coordinate
&coor
)
{
output
<< "(" << coor
.m_iX
<< "," << coor
.m_iY
<< ")";
return output
;
}
转载请注明原文地址: https://yun.8miu.com/read-109592.html