数据结构与算法-实验2-自定义栈,并实现push、pop、改栈顶元素、取栈顶元素
2016-11-07 09:36
495 查看
#include <iostream>
using namespace std;
const int maxnum = 3;
typedef struct Datastack //定义栈中层数据类型
{
int data; //节点中数据类型
struct Datastack * pre, *next; //双向栈
}datastack;
datastack *Create_stack(); //创建栈,返回计数节点指针
datastack *push_stack(datastack *p,
int data); //进栈
datastack *pop_stack(datastack *p); //出栈
datastack *changeTop_stack(datastack *p,
int data); //改栈顶元素
int top_stack(datastack *p); //取栈顶元素
bool Isempty_stack(datastack *p); //栈空判断
bool Isfull_stack(datastack *p); //栈满判断
int main()
{
datastack *head =
NULL; //定义头指针
cout << "Create_stack() 正在创建一个栈区域... "; //创建栈存储区
head = Create_stack();
if (head !=
NULL)
{
cout << "创建栈存储区成功!\n";
}
else
{
cout << "创建栈存储区失败!\n";
return 0;
}
cout << "Isempty() return "; //判空
if (Isempty_stack(head))
{
cout << "现在栈为空!\n";
}
else
{
cout << "现栈中存在元素!\n";
}
cout << "push(2)" << endl; //进栈第一个元素
head = push_stack(head, 2);
cout << "top() return " << top_stack(head) << endl;
cout << "push(5)" << endl; //进栈第二个元素
head = push_stack(head, 5);
cout << "top() return " << top_stack(head) << endl;
cout << "push(11)" << endl; //进栈第三个元素
head = push_stack(head, 11);
cout << "top() return " << top_stack(head) << endl;
cout << "changeTop_stack()=6;" << endl; //改变栈顶元素
head = changeTop_stack(head, 6);
cout << "changeTop_stack() return " << top_stack(head) << endl;
cout << "Isfull(): return "; //判满
if (Isfull_stack(head))
{
cout << "栈已满!\n";
}
else
{
cout << "栈中还可以存储元素!\n";
}
cout << "pop(6)" << endl; //出栈第一个元素
head = pop_stack(head);
cout << "top() return " << top_stack(head) << endl;
cout << "pop(5)" << endl; //出栈第二个元素
head = pop_stack(head);
cout << "top() return " << top_stack(head) << endl;
cout << "pop(2) return " << endl; //出栈第三个元素
head = pop_stack(head);
cout << "Isempty() return "; //判空
if (Isempty_stack(head))
{
cout << "现在栈为空!\n";
}
else
{
cout << "现栈中存在元素!\n";
}
free(head);
return 0;
}
datastack *Create_stack() //创建一个栈计数节点,最后返回栈底指针
{
datastack *p =
NULL;
datastack *s =
NULL;
s = (datastack *)malloc(sizeof(datastack)); //只创建计数节点
s->pre = NULL;
s->data = 0;
s->next = NULL;
p = s;
return p;
}
//进栈
datastack *push_stack(datastack *p,
int data)
{
datastack *s =
NULL;
if (Isfull_stack(p)) //判满
{
cout << "栈已满,入栈操作失败!\n";
return p;
}
if (p->data == 0)
{
s = (datastack *)malloc(sizeof(datastack)); //节点空间
s->pre = p;
s->data = data;
s->next = NULL;
p->next = s;
p->data++;
}
else
{
s = (datastack *)malloc(sizeof(datastack)); //新节点空间
s->pre = p->next;
s->data = data;
s->next = NULL;
(p->next)->next = s;
p->next = s;
p->data++;
}
return p;
}
//出栈
datastack *pop_stack(datastack *p)
{
datastack *pfree =
NULL;
if (Isempty_stack(p)) //判空
{
cout << "栈已空,出栈操作失败!\n";
return p;
}
pfree = p->next;
p->next = pfree->pre;
(p->next)->next =
NULL;
pfree->pre = NULL;
free(pfree);
p->data--;
return p;
}
//取栈顶元素
int top_stack(datastack *p)
{
if (Isempty_stack(p)) //判空
{
cout << "栈已空,栈顶无元素!\n";
return 0;
}
return (p->next)->data;
}
//改栈顶元素
datastack *changeTop_stack(datastack *p,
int data)
{
if (Isempty_stack(p)) //判空
{
cout << "栈已空,改栈顶元素操作失败!\n";
return p;
}
(p->next)->data =
data;
return p;
}
//判栈满
bool Isfull_stack(datastack *p)
{
if (p->data == maxnum)
{
return true;
}
return false;
}
//判栈空
bool Isempty_stack(datastack *p)
{
if (p->data == 0)
{
return true;
}
return false;
}
using namespace std;
const int maxnum = 3;
typedef struct Datastack //定义栈中层数据类型
{
int data; //节点中数据类型
struct Datastack * pre, *next; //双向栈
}datastack;
datastack *Create_stack(); //创建栈,返回计数节点指针
datastack *push_stack(datastack *p,
int data); //进栈
datastack *pop_stack(datastack *p); //出栈
datastack *changeTop_stack(datastack *p,
int data); //改栈顶元素
int top_stack(datastack *p); //取栈顶元素
bool Isempty_stack(datastack *p); //栈空判断
bool Isfull_stack(datastack *p); //栈满判断
int main()
{
datastack *head =
NULL; //定义头指针
cout << "Create_stack() 正在创建一个栈区域... "; //创建栈存储区
head = Create_stack();
if (head !=
NULL)
{
cout << "创建栈存储区成功!\n";
}
else
{
cout << "创建栈存储区失败!\n";
return 0;
}
cout << "Isempty() return "; //判空
if (Isempty_stack(head))
{
cout << "现在栈为空!\n";
}
else
{
cout << "现栈中存在元素!\n";
}
cout << "push(2)" << endl; //进栈第一个元素
head = push_stack(head, 2);
cout << "top() return " << top_stack(head) << endl;
cout << "push(5)" << endl; //进栈第二个元素
head = push_stack(head, 5);
cout << "top() return " << top_stack(head) << endl;
cout << "push(11)" << endl; //进栈第三个元素
head = push_stack(head, 11);
cout << "top() return " << top_stack(head) << endl;
cout << "changeTop_stack()=6;" << endl; //改变栈顶元素
head = changeTop_stack(head, 6);
cout << "changeTop_stack() return " << top_stack(head) << endl;
cout << "Isfull(): return "; //判满
if (Isfull_stack(head))
{
cout << "栈已满!\n";
}
else
{
cout << "栈中还可以存储元素!\n";
}
cout << "pop(6)" << endl; //出栈第一个元素
head = pop_stack(head);
cout << "top() return " << top_stack(head) << endl;
cout << "pop(5)" << endl; //出栈第二个元素
head = pop_stack(head);
cout << "top() return " << top_stack(head) << endl;
cout << "pop(2) return " << endl; //出栈第三个元素
head = pop_stack(head);
cout << "Isempty() return "; //判空
if (Isempty_stack(head))
{
cout << "现在栈为空!\n";
}
else
{
cout << "现栈中存在元素!\n";
}
free(head);
return 0;
}
datastack *Create_stack() //创建一个栈计数节点,最后返回栈底指针
{
datastack *p =
NULL;
datastack *s =
NULL;
s = (datastack *)malloc(sizeof(datastack)); //只创建计数节点
s->pre = NULL;
s->data = 0;
s->next = NULL;
p = s;
return p;
}
//进栈
datastack *push_stack(datastack *p,
int data)
{
datastack *s =
NULL;
if (Isfull_stack(p)) //判满
{
cout << "栈已满,入栈操作失败!\n";
return p;
}
if (p->data == 0)
{
s = (datastack *)malloc(sizeof(datastack)); //节点空间
s->pre = p;
s->data = data;
s->next = NULL;
p->next = s;
p->data++;
}
else
{
s = (datastack *)malloc(sizeof(datastack)); //新节点空间
s->pre = p->next;
s->data = data;
s->next = NULL;
(p->next)->next = s;
p->next = s;
p->data++;
}
return p;
}
//出栈
datastack *pop_stack(datastack *p)
{
datastack *pfree =
NULL;
if (Isempty_stack(p)) //判空
{
cout << "栈已空,出栈操作失败!\n";
return p;
}
pfree = p->next;
p->next = pfree->pre;
(p->next)->next =
NULL;
pfree->pre = NULL;
free(pfree);
p->data--;
return p;
}
//取栈顶元素
int top_stack(datastack *p)
{
if (Isempty_stack(p)) //判空
{
cout << "栈已空,栈顶无元素!\n";
return 0;
}
return (p->next)->data;
}
//改栈顶元素
datastack *changeTop_stack(datastack *p,
int data)
{
if (Isempty_stack(p)) //判空
{
cout << "栈已空,改栈顶元素操作失败!\n";
return p;
}
(p->next)->data =
data;
return p;
}
//判栈满
bool Isfull_stack(datastack *p)
{
if (p->data == maxnum)
{
return true;
}
return false;
}
//判栈空
bool Isempty_stack(datastack *p)
{
if (p->data == 0)
{
return true;
}
return false;
}
相关文章推荐
- 数据结构与算法-实验3-自定义栈,并实现走迷宫问题
- 数据结构——快速排序原理及算法Java实现
- 数据结构与算法(C#实现)系列---演示篇(一)(外摘)
- 数据结构中关键路径算法的实现与应用
- 【数据结构与算法】左偏树(堆)的实现
- 数据结构实验2---表达式求值(“栈”实现)
- 数据结构实验四:图的表示和实现
- 数据结构与算法之单链表 自己实现STL list模板类
- 【数据结构与算法】第三章 栈c实现,使用链表结构
- 数据结构与算法---C#实现LinkedList实例
- 数据结构与算法(C#实现)系列---二叉树
- 基于关系数据库系统链式存储的树型结构数据,求某结点下的子树所有结点算法(t-sql语言实现)
- 【数据结构与算法】堆排序算法实现
- 数据结构中关键路径算法的实现与应用
- 数据结构 算法面试100题 之 逐层遍历二叉树元素
- 【并查集】数据结构与算法实验题 11.3 培养箱分配问题
- (原创)基于关系数据库系统链式存储的树型结构数据,求某结点下的子树所有结点算法(t-sql语言实现)
- 数据结构与算法(C#实现)系列---二叉树
- 数据结构之单链表在第i个元素之前插入元素的算法
- 数据结构实验课程----实验二(利用链表实现学生健康系统)