栈的基本操作与应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
六、实验完成情况与总结
1、完成情况如下表(完成划勾、没完成打叉):
实验名称
实验完成情况
实验内容(1)
1
2
3
4
5
6
实验内容(2)
1
2
3
4
5
6
7
思考与提高(1)
思考与提高(2)
2、总结(自己对本部分知识的掌握情况以及存在的问题分析)
感觉自己对这些还是不够熟练,所以在打代码的时候还是要借助书籍,数据结构不得不说是一种对人的思维一种考验,希望自己能够认真的对待,一直想着成功出发。
(2)分别用链式栈和顺序栈实现计算t(n)的非递归算法。
四、思考与提高
1.如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。如何解决这个问题?
五、实验步骤(每个实验内容包含代码、输入、输出、错误分析):
1、实验内容(1):
#include <iostream>
#include<cstdio>
#include<stdlib.h>
#define true 1
#define null 0
#define ok 1
#define error 0
#define overflow -1
#define stack_init_size 100
{
Node *p1;
cout<<"栈内元素如下:"<<endl;
if(p->base==p->top)
{
cout<<"栈为空!!"<<endl;
exit(0);
}
p1=p->top;
while(p1!=NULL)
{
cout<<p1->data;
p1=p1->next;
}
cout<<endl;
}
int Length(Stack *p)
{
s.top=s.base;
cout<<endl<<"栈已经为您清空"<<endl;
}
destroystack(sqstack &s)
{
int i,len;
len=s.stacksize;
for (i=0; i<len; i++)
{
free(s.base);
s.base++;
}
cout<<"栈已经为您销毁"<<endl;
2.编写完整程序完成下面的实验内容并上机运行。
3.整理并上交实验报告。
三、实验内容
1.编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。
2.已知函数t(n)=2*t(n/2)+n其中t(0)=0,n为整数。编写程序实现:
(1)计算t(n)的递归算法。
}
int main()
{
sqstack p;
initstack(p);
cout<<"请输入栈的长度"<<endl;
int i;
cin>>i;
cout<<"请您依次输入"<<i<<"个栈元素"<<endl;
for(int j=0; j<i; j++)
{
int w;
cin>>w;
push(p,w);
}
cout<<"现在为您依次出栈栈顶元素"<<endl;
for(int j=0; j<i; j++)
{
int w,k;
gettop(p,w);
cout<<w<<" ";
pop(p,k);
}
clearstack(p);
destroystack(p);
}
2、实验内容(2):
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct node
{
int data;
struct node *next;
} Node;
typedef struct
{
Node *top;
Node *base;
} Stack;
int InitNode(Stack *p)
{
p->base=(Node *)malloc(sizeof(Node));
status initstack(sqstack &s)
{
s.base=(selemtype *)malloc(stack_init_size * sizeof(selemtype));
if(!s.base)exit(overflow);
s.top=s.base;
s.stacksize=stack_init_size;
InitNode(&p);
cout<<"请输入n,计算t(n):"<<endl;
cin>>n;
Push(&p,0);
length=Length(&p);
for(i=1; i<=n; i++)
{
e=2*getelem(&p,(length-(i/2)))+i;
Push(&p,e);
length=Length(&p);
}
b=getTop(&p,b);
cout<<"用链栈得到的结果如下:"<<endl;
cout<<"t("<<n<<")"<<"="<<b<<endl;
cout<<"用顺序栈得到的结果如下:"<<endl;
cout<<"t("<<n<<")"<<"="<<b<<endl;
cout<<"用递归方法得到的结果如下:"<<endl;
s.stacksize+=stackincrement;
}
*s.top++=e;
return ok;
}
status pop(sqstack &s,selemtype &e)
{
if(s.top==s.base)return error;
e=*--s.top;
return ok;
}
clearstack(sqstack &s)
e=p->top->data;
p1=p->top;
p->top=p->top->next;
free(p1);
return 1;
}
int getTop(Stack *p,int e)
{
if(p->base==p->top)
return 0;
e=p->top->data;
return e;
}
void print(Stack *p)
{
int a=0;
Node *p1;
p1=p->top;
while(p1!=NULL)
{
p1=p1->next;
a++;
}
return a;
}
int getelem(Stack *p,int i)
{
Node *p1;
int k=1,a=0;
if(p->base==p->top)
return 0;
p1=p->top;
w=add(n);
cout<<"t("<<n<<")"<<"="<<w<<endl;
return 0;
}
3、思考与提高
1.如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。如何解决这个问题?
让多个栈共用一个足够大的连续存储空间,利用栈的动态特性使它们的存储空间互补。
while((p1!=NULL)&&(k<i))
{
p1=p1->next;
k++;
}
return p1->data;
}
int add(int x)
{
int a;
if(x==0)
a=0;
else
a=(2*add(x/2)+x);
return a;
}
int main()
{
Stack p;
int i,b=0,e=0,n,w=0,length=0;
cout<<"已为您创造一个空栈"<<endl;
return ok;
}
status gettop(sqstack s,selemtype &e)
{
if(s.top==s.base) return error;
e=*(s.top-1);
return ok;
}
status push(sqstack &s,selemtype e)
#define stackincrement 10
using namespace std;
typedef int selemtype;
typedef int status;
typedef struct
{
selemtype *base;
selemtype *top;
int stacksize;
} sqstack;
实验报告
课程名称数据结构实验名称栈的基本操作与应用
姓名王灵慧专业班级软工18104学号201817040409
试验日期2019-11-06试验地点E3-502指导老师邹汉斌成绩
一、实验目的
1.熟悉并能实现栈的定义和基本操作。
2.了解和掌握栈在递归和非递归算法的应用。
二、实验要求
1.进行栈的基本操作时要注意栈“后进先出”的特性。
{
if(s.top-s.base>=s.stacksize)
{
s.base=(selemtype *)realloc(s.base,(s.stacksize+stackincrement)*sizeof(selemtype));
if(!s.base)exit(overflow);
s.top=s.base+s.stacksize;
{
p1->data=e;
p->top=p1;
p1->next=NULL;
}
else
{
p1->data=e;
p1->next=p->top;
p->top=p1;
}
return 1;
}
int Pop(Stack *p,int e)
{
Node *p1;
if(p->base==p->top)
return 0;
if(!p->base)
return 0;
p->top=p->base;
p->top->data=0;
p->top->neBiblioteka Baidut=NULL;
return 1;
}
int Push(Stack *p,int e)
{
Node *p1;
p1=(Node*)malloc(sizeof(Node));
if(p->base==p->top)
相关文档
最新文档