@这篇文档是由C++代码实现栈
栈就是先进后出的一种数据结构,这篇文档通过数组实现栈,要求是:栈是顺序的(即栈的长度初始化后给定了,如果栈中插入元素到了最后一个位置表示栈已满不能再插入新的元素),其次栈的插入类型没有定,所以建立的是模板类和函数模板,最后通过调用类模板在main()函数中实现。
本文是以Visual Studio中新建的C++win32的控制台应用程序实现的,其中建立了头文件和源文件以及实现main()的demo文件,分别是MyStack.h和MyStack.cpp和demo.cpp文件。
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()
{
cout
<< "此时的队列长度为:" << m_iMyStackLength
<< endl
;
return 0;
}
template
<typename
T>
bool MyStack
<T>::MyStackEmpty()
{
return 0 == m_iTos
?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;
cout
<< "已经成功清除栈内的所有元素!" << m_iMyStackLength
<< endl
;
}
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
++;
cout
<< "已成功加入新的元素:" << element
<< endl
;
return true;
}
}
template
<typename
T>
bool MyStack
<T>::DeleteElement(T &element
)
{
if(MyStackEmpty())
{
cout
<< "该栈为空,不能再删除元素!" << endl
;
return false;
}
else
{
m_iTos
--;
element
= m_tMyStack
[m_iTos
];
m_iMyStackLength
--;
cout
<< "已成功删除元素:" << element
<< endl
;
return true;
}
}
template
<typename
T>
bool MyStack
<T>::TraversalMyStack()
{
if(MyStackEmpty())
{
cout
<< "该栈为空,不能遍历出任何元素!" << endl
;
return false;
}
else
{
cout
<< "现将栈内的元素一一打印如下:" << endl
;
for(int i
=(m_iTos
-1);i
>=0; i
--)
{
cout
<< m_tMyStack
[i
] << endl
;
}
return true;
}
}
demo.cpp文件(这个文件中实例化模板类一定要注意将MyStack.cpp文件包含进来,要不然会报错)
#include
<iostream
>
#include
"MyStack.h"
#include
"MyStack.cpp"
using namespace std
;
int
main(void)
{
MyStack
<double
> stack(5);
stack
.InsertElement(10.1);
stack
.InsertElement(11.2);
stack
.InsertElement(12.3);
stack
.InsertElement(13.4);
stack
.InsertElement(14.5);
stack
.InsertElement(15.6);
stack
.TraversalMyStack();
double e
=0.1;
stack
.DeleteElement(e
);
cout
<< endl
;
stack
.TraversalMyStack();
cout
<< endl
;
stack
.MyStackLen();
stack
.TraversalMyStack();
cout
<< endl
;
stack
.ClearMyStack();
stack
.TraversalMyStack();
system("pause");
return 0;
}
栈的实现和队列的实现不一样的地方就是栈只需要一个指针m_iTos来记录栈中元素的位置,所以无论是插入元素还是删除元素,都相对来说简单一些,只是在 标记元素的时候需要注意++和–的先后顺序。
转载请注明原文地址: https://yun.8miu.com/read-54159.html