数据结构之栈的链式存储7-(入栈,出栈等)
2015-09-14 14:40
417 查看
本次操作采用不带头结点的头插法,方便在栈顶进行入栈和出栈操作
代码如下
//栈只限于在末尾插入或者删除,建立头插法不带头结点方法较简单实现
#include <iostream>
#include <cstdlib>
using namespace std;
template<typename T>
struct Node{
T data;
Node<T> *next;
};
template<typename T>
class LinkStack{
private:
Node<T> *top; //栈顶指针
public:
LinkStack(){ top = NULL; } //构造空栈
~LinkStack();
void Push(T x); //元素入栈
T Pop(); //元素出栈
T GetTop(); //获取栈顶元素
bool StackEmpty(); //检测栈是否为空
int StackLength(); //测定栈长度
void StackTranverse(); //遍历栈中元素
};
//元素入栈(不检查栈满情况对比顺序存储结构)
template<typename T>
void LinkStack<T>::Push(T x)
{
Node<T> *s = NULL;
s = new Node<T>;
if (!s)
throw "内存分配失败 \n";
s->data = x;
s->next = top;
top = s; //成为新的栈顶指针
}
//元素出栈
template<typename T>
T LinkStack<T>::Pop()
{
if (!top) //无元素
throw "无元素 \n";
Node<T> *p = top;
T e = p ->data;
top = top->next;
delete p;
return e;
}
//获取栈顶元素
template<typename T>
T LinkStack<T>::GetTop()
{
return top->data;
}
//测定栈长度
template<typename T>
int LinkStack<T>::StackLength()
{
int cnt = 0;
Node<T> *p = top;
while (p)
{
cnt++;
p = p->next;
}
return cnt;
}
//检测栈是否为空
template<typename T>
bool LinkStack<T>::StackEmpty()
{
return StackLength() == 0;
}
//遍历栈中元素
template<typename T>
void LinkStack<T>::StackTranverse()
{
Node<T> *p = top;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
template<typename T>
LinkStack<T>::~LinkStack()
{
Node<T> *p = NULL;
while (top)
{
p = top;
top = top->next;
delete p;
}
}
int main()
{
LinkStack<int> s;
cout << "依次向栈中放入1-5的连续数:";
for (int j = 1; j <= 5; ++j) //采取头插法
s.Push(j);
cout << "现在栈中的元素为:";
s.StackTranverse();
cout << "现在执行出栈操作 \n";
cout << "出栈的元素为:" << s.Pop() << endl;
cout << "栈的长度为:" << s.StackLength() << endl;
if (s.StackEmpty())
cout << "栈为空 \n";
else
cout << "栈不为空 \n";
cout << "现在栈中的元素为:";
s.StackTranverse();
cout << "向栈中放入10和11 \n";
s.Push(10);
s.Push(11);
cout << "现在栈中的元素为:";
s.StackTranverse();
cout << "栈顶元素为:" << s.GetTop() << endl;
system("pause");
return 0;
}运行结果如下
代码如下
//栈只限于在末尾插入或者删除,建立头插法不带头结点方法较简单实现
#include <iostream>
#include <cstdlib>
using namespace std;
template<typename T>
struct Node{
T data;
Node<T> *next;
};
template<typename T>
class LinkStack{
private:
Node<T> *top; //栈顶指针
public:
LinkStack(){ top = NULL; } //构造空栈
~LinkStack();
void Push(T x); //元素入栈
T Pop(); //元素出栈
T GetTop(); //获取栈顶元素
bool StackEmpty(); //检测栈是否为空
int StackLength(); //测定栈长度
void StackTranverse(); //遍历栈中元素
};
//元素入栈(不检查栈满情况对比顺序存储结构)
template<typename T>
void LinkStack<T>::Push(T x)
{
Node<T> *s = NULL;
s = new Node<T>;
if (!s)
throw "内存分配失败 \n";
s->data = x;
s->next = top;
top = s; //成为新的栈顶指针
}
//元素出栈
template<typename T>
T LinkStack<T>::Pop()
{
if (!top) //无元素
throw "无元素 \n";
Node<T> *p = top;
T e = p ->data;
top = top->next;
delete p;
return e;
}
//获取栈顶元素
template<typename T>
T LinkStack<T>::GetTop()
{
return top->data;
}
//测定栈长度
template<typename T>
int LinkStack<T>::StackLength()
{
int cnt = 0;
Node<T> *p = top;
while (p)
{
cnt++;
p = p->next;
}
return cnt;
}
//检测栈是否为空
template<typename T>
bool LinkStack<T>::StackEmpty()
{
return StackLength() == 0;
}
//遍历栈中元素
template<typename T>
void LinkStack<T>::StackTranverse()
{
Node<T> *p = top;
while (p)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
template<typename T>
LinkStack<T>::~LinkStack()
{
Node<T> *p = NULL;
while (top)
{
p = top;
top = top->next;
delete p;
}
}
int main()
{
LinkStack<int> s;
cout << "依次向栈中放入1-5的连续数:";
for (int j = 1; j <= 5; ++j) //采取头插法
s.Push(j);
cout << "现在栈中的元素为:";
s.StackTranverse();
cout << "现在执行出栈操作 \n";
cout << "出栈的元素为:" << s.Pop() << endl;
cout << "栈的长度为:" << s.StackLength() << endl;
if (s.StackEmpty())
cout << "栈为空 \n";
else
cout << "栈不为空 \n";
cout << "现在栈中的元素为:";
s.StackTranverse();
cout << "向栈中放入10和11 \n";
s.Push(10);
s.Push(11);
cout << "现在栈中的元素为:";
s.StackTranverse();
cout << "栈顶元素为:" << s.GetTop() << endl;
system("pause");
return 0;
}运行结果如下
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- C++基于栈实现铁轨问题
- 数据结构之Treap详解
- C语言栈的表示与实现实例详解
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C语言实现颠倒栈的方法
- C++实现简单的学生管理系统
- 算法系列15天速成 第十天 栈
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- JavaScript数据结构和算法之图和图算法
- Array栈方法和队列方法的特点说明
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- C#实现的简单链表类实例
- Java数据结构及算法实例:冒泡排序 Bubble Sort