数据结构复习之——栈
一.基本概念(个人理解)
栈也称堆栈,是一种特殊的线性表,只能在表的尾部加入新的元素,称为入栈或压栈(push),也只能在表尾删除元素,称为出栈(pop)。表的尾部为栈顶,头部为栈底。栈这个概念在本学期学的汇编语言程序设计课程中也多次提及,在数据存储上有“先进先出”的原则(就像叠盘子取盘子,永远放的是最上面的一个,取的也是最上面的一个),是存取数据的一个利器,应该善加利用。
二.对于栈的基本操作
1.入栈:使用单链表插入节点的方式来入栈,添加新的元素
2.出栈:弹出栈顶元素
3.得到栈的深度
4.返回栈顶元素
5.输出整个栈的内容
6.判断栈是否为空
目前只想到了这一些,之后再来慢慢补充。
三.实现分析(c++,链表实现)
(一)数据结构的设计分析
1.一个元素(结点):
一个结构体,包含了:
1.储存的数据:T data
2.下一个元素的地址:*pnext
2.整个栈:
一个类,其中包含:
public:
1.构造函数,析构函数
2.入栈:push_elem(T dataipt )
3.出栈:pop_elem()
4.得到栈顶内容:T GetTop()
5.得到栈的深度:int GetDepth()
6.判断是否为空:bool JudgeEmpty()
private:
1.栈顶的指针
2.深度(长度)计数器
(二)相关的定义以及声明(依然选择用模板来实现)
单个节点:
template<typename T>
class StackNode{
public:
T data;
StackNode<T> *pnext;
};
栈:
template<typename T>
class My_Stack{
public:
My_Stack();
~My_Stack(){}
void Init_Stack();
void Push_elem(T dataipt);
T Pop_elem();
void Print();
int GetDepth() const {return depth;}
T Get_Top();
bool JudgeEmpty();
private:
StackNode<T> *Top_Ptr;
StackNode<T> *Node_Ptr;
int depth;
};
(三)函数的实现(代码)
template<typename T>
My_Stack<T>::My_Stack()
{
Init_Stack();
}
template<typename T>
void My_Stack<T>::Init_Stack()
{
Top_Ptr=NULL;
this->depth=0;
}//used for initiation
template<typename T>
void My_Stack<T>::Push_elem(T dataipt)
{
Node_Ptr=Top_Ptr;
if(Top_Ptr==NULL)
{
Top_Ptr=new StackNode<T>;
Top_Ptr->data=dataipt;
Top_Ptr->pnext=NULL;
}
//judge if the stack is empty!
else
{
Top_Ptr=NULL;
Top_Ptr=new StackNode<T>;
Top_Ptr->pnext=Node_Ptr;
Top_Ptr->data=dataipt;
}
depth++;
}//push elements
template<typename T>
T My_Stack<T>::Pop_elem()
{
T tempdata=Top_Ptr->data;
if(this->depth==0)std::cout<<"the stack is empty"<<std::endl;
else if(this->depth==1)
{
delete Top_Ptr;
std::cout<<"pop successful"<<std::endl;
Top_Ptr=NULL;
Node_Ptr=NULL;
depth--;
}
else
{
delete Top_Ptr;
Top_Ptr=Node_Ptr;
if(Node_Ptr->pnext!=NULL)
{
Node_Ptr=Node_Ptr->pnext;
}
depth--;
std::cout<<"pop successful"<<std::endl;
}
return tempdata;
}//pop the element on the top
template<typename T>
void My_Stack<T>::Print()
{
StackNode<T> *trav_ptr=Top_Ptr;
std::cout<<"Top"<<std::endl;
while(trav_ptr!=NULL)
{
std::cout<<"---"<<std::endl;
std::cout<<trav_ptr->data<<std::endl;
trav_ptr=trav_ptr->pnext;
}
std::cout<<"---"<<std::endl;
std::cout<<"Bottom"<<std::endl;
}//view on the stack
template<typename T>
T My_Stack<T>::Get_Top()
{
return *Top_Ptr;
}
template<typename T>
bool My_Stack<T>::JudgeEmpty()
{
if(Top_Ptr==NULL)return true;
else return false;
}
(四)测试一下
int main()
{
My_Stack<int> s1;
s1.Push_elem(1);
s1.Push_elem(2);
s1.Push_elem(3);
s1.Push_elem(4);
s1.Push_elem(5);
s1.Print();
int i=s1.Pop_elem();
i=s1.Pop_elem();
s1.Print();
return 0;
}
算是成功了吧,下回再贴点相关的题目。