文档库 最新最全的文档下载
当前位置:文档库 › 栈的共享 数据结构

栈的共享 数据结构

栈的共享 数据结构
栈的共享 数据结构

实验二共享栈

一、设计的目的要求

1、了解栈的特性,以及它在实际问题中的应用。

2、掌握栈的实现方法以及它的基本操作,学习运用栈来解决问题。

二、设计的主要内容

设计两个顺序栈共享空间,试写出两个栈公用的栈操作算法push(x,k)和pop(k),其中k为0或1,用以指示栈号。编写一个完整的程序实现。

三、设计的解题思路

线性表(a1,a2,……,an)试一种逻辑结构,若在计算机中对它采用顺序栈存储结构来存储,则就是栈表。两个栈表公用一个内存空间图示如下:

一个数组的存储空间(a1,a2,……,amaxsize-1)中,实现方法是:设置两个栈顶指针变量top[1]和top[0],开始时top[0] = -1和top[1] = maxsize表示两个栈均为空,然后根据变量k是0还是1,分别进行入栈和出栈的操作。

具体实现还要编写一个完整的程序,用主函数调用这里的函数来完成出入栈的操作。

四、算法思路

#include

#include

#include

#include

#define maxsize 10

typedef int datatype;

typedef struct

{

datatype data[maxsize];

int top[2];

}sqstack; //定义一个结构体类型的sqstack

sqstack a,*s; //定义一个结构体类型变量a和指针变量ss

sqstack *init(sqstack *s) //初始化两个栈均为空,s是指向栈类型的指针

{

s=(sqstack *)malloc(sizeof(sqstack)); //申请空间

s->top[0]=-1; //top[1]、top[0]分别是第0和第1 个栈的栈顶指针

s->top[1]=maxsize;

return s;

}

int push(sqstack *s,datatype x,int k) //入栈操作,s是栈顶指针,x是要插入的数,k是栈号

{

if(s->top[0]+1==s->top[1])

{

printf("\n");

printf("两个栈均满,不能进栈!\n"); //判断是否栈满

return 0;

}

if(k==0)

s->top[k]++; //改栈顶指针加1或减1,来选择不满的栈

else

s->top[k]--;

s->data[s->top[k]]=x; //将X插入当前栈顶

return 1;

}

int pop(sqstack *s,int k) //出栈操作,栈顶元素由参数x返回

{

int x;

if((k==0&&s->top[0]==-1)||(k==1&&s->top[1]==maxsize))

{

printf("栈空,不能退栈!\n\n");

return 0;

}

x=s->data[s->top[k]]; //区栈顶元素给X

if(k==0)

s->top[k]--; //改栈顶指针加1或减1,来选择不满的栈

else

s->top[k]++;

return x;

}

void get(sqstack *s,int l) //元素输入函数,l来判断是否已经建栈

{

int k=0,x;

while(k==1||k==0)

{

if(l==0)

{

printf("栈还未建立!\n");

break;

}

else

{

printf("请选择输入方向,正向(0),方向(1),结束(2):"); //选择要输入的栈号,并输入元素

scanf("%d",&k);

printf("\n");

if(k==0|k==1)

{

x=0;

printf("请输入数据:");

while(x!=-1)

{

scanf("%d",&x);

if(x==-1)

break;

push(s,x,k);

}

printf("\n");

}

else

break;

}

}

}

void check(sqstack *s) //检测栈内的元素但并不输出

{

int i,l=0;

while(l==0||l==1)

{

printf("请选择输出方向,正向(0),方向(1),结束(2):");

scanf("%d",&l);

printf("\n");

if(l==2)

break;

else if((l==0&&s->top[0]==-1)||(l==1&&s->top[1]==maxsize))

{

printf("栈空,不能退栈!\n\n");

continue;

}

else if(l==0)

{

printf("正向数据为:");

for(i=0;i<=s->top[l];i++)

printf("%4d",s->data[i]);

printf("\n\n");

}

else

{

printf("反向数据为:");

for(i=maxsize-1;i>=s->top[l];i--)

printf("%4d",s->data[i]);

printf("\n\n");

}

}

}

void print(sqstack *s) //元素输出函数{

int x,z=1,f=1,l=0;

while(l==0||l==1)

{

printf("请选择输出方向,正向(0),方向(1):"); scanf("%d",&l);

printf("\n");

x=pop(s,l);

if(x==0)

{

printf("选择'1'继续,'0'结束输出:");

scanf("%d",&l);

printf("\n");

if(l==1)

continue;

else

break;

printf("\n");

}

else if(l==0)

{

printf("正向第%d个:%d\n",z,x);

z++;

printf("\n");

}

else

{

printf("反向第%d个:%d\n",f,x);

f++;

printf("\n");

}

}

}

void menu() //菜单函数

{

printf(" 栈的共享实验\n" );

printf("==================================\n");

printf(" 1.栈的建立\n" );

printf(" 2.栈的共享输入\n" );

printf(" 3.栈单个的输出\n" );

printf(" 4.栈的检测\n" );

printf(" 0.退出实验\n" );

printf("==================================\n" );

}

void main() //主函数

{

int h,k,l=0; //定义’l’为标志,判断是否已建栈,如未建立l=0,否则l=1

char i;

sqstack *s;

for(;;)

{

menu();

printf(" 请选择 0--4:" );

scanf("%d",&h);

if(h<0||h>4)

{

printf("\n输人错误! \n" );

printf("Enter 'y' to contunie :");

scanf("%s",&i);

system("cls");

continue;

}

else

switch(h)

{

case 1:

system("cls");

printf("**********************************************\n"); printf("* 栈的建立*\n");

printf("**********************************************\n"); printf("\n");

s=init(s); //栈的建立

printf("Enter 'y' to contunie :");

scanf("%s",&i);

printf("\n");

l=1;

system("cls");

break;

case 2:

system("cls");

printf("*******************************************\n");

printf("* 栈的共享输入*\n");

printf("******************************************\n" );

get(s,l); // 栈的输入

printf("\n");

printf("Enter 'y' to contunie :");

scanf("%s",&i);

printf("\n");

system("cls");

break;

case 3:

system("cls");

printf("**********************************************\n" ); printf("* 栈单个的输出* \n");

printf("***********************************************\n" ); print(s); //栈的单个输出

printf("\n");

system("cls");

break;

case 4:

system("cls");

printf("**********************************************\n" ); printf("* 栈的检测* \n");

printf("***********************************************\n" ); check(s); //对栈内元素的检测

printf("\n");

system("cls");

break;

case 0:

system("cls");

printf("* 再见!*\n");

printf("\n");

return 0;

}

}

}

五、运算结果

结果一:0号栈输入元素(1,2,3,4,7,8,10),1号栈输入元素(0,5,6)栈的共享实验

2.栈的共享输入

3.栈单个的输出

4.栈的检测

0.退出实验

* 栈的建立*

Enter ‘y’to continue :y (回车)

*栈的共享输入*

请选择输入方向,正向(0),方向(1),结束(2): 0 (回车)

请输入数据:1 2 3 4 7 8 10 –1 (回车)

请选择输入方向,正向(0),方向(1),结束(2): 1 (回车)

请输入数据:0 5 6 –1 (回车)

请选择输入方向,正向(0),方向(1),结束(2): 2 (回车)

Enter ‘y’to continue :y (回车)

*栈的检测*

请选择输入方向,正向(0),方向(1),结束(2): 0 (回车)

正向数据为:1 2 3 4 7 8 10

请选择输入方向,正向(0),方向(1),结束(2): 1 (回车)

反向数据为:0 5 6

请选择输入方向,正向(0),方向(1),结束(2): 2 (回车)

* 栈的单个输出 *

请选择输出方向,正向(0),方向(1): 0 (回车)正向第1个:10

请选择输出方向,正向(0),方向(1): 0 (回车)正向第2个:8

请选择输出方向,正向(0),方向(1): 0 (回车)正向第3个:17

请选择输出方向,正向(0),方向(1): 0 (回车)正向第4个:4

请选择输出方向,正向(0),方向(1): 0 (回车)正向第5个:3

请选择输出方向,正向(0),方向(1): 0 (回车)正向第6个:2

请选择输出方向,正向(0),方向(1): 0 (回车)正向第7个:1

请选择输出方向,正向(0),方向(1): 0 (回车)栈空,不能退栈!

选择'1'继续,'0'结束输出:1 (回车)

请选择输出方向,正向(0),方向(1): 1 (回车)反向第1个:6

请选择输出方向,正向(0),方向(1): 1 (回车)反向第2个:5

请选择输出方向,正向(0),方向(1): 1 (回车)反向第3个:0

请选择输出方向,正向(0),方向(1): 1 (回车)栈空,不能退栈!

选择'1'继续,'0'结束输出:0 (回车)

栈的共享实验

5.栈的建立

6.栈的共享输入

7.栈单个的输出

8.栈的检测

1.退出实验

请选择0--4:0 (回车)

* 再见*

按任意键继续……

结果二:还未建立栈就输入数据

栈的共享实验

1. 栈的建立

2. 栈的共享输入

3.栈单个的输出

4.栈的检测

0.退出实验

请选择0--4:2 (回车)

*栈的共享输入*

栈还未建立!

Enter ‘y’to continue :y (回车)

结果三:输入的数据过多时

栈的共享实验

1. 栈的建立

2. 栈的共享输入

3.栈单个的输出

4.栈的检测

0.退出实验

请选择0--4:1 (回车)

* 栈的建立*

Enter ‘y’to continue :y (回车)

*栈的共享输入*

请选择输入方向,正向(0),方向(1),结束(2): 0 (回车)请输入数据:1 2 3 4 5 6 7 8 9 10 11 –1 (回车)

两栈均满,不能进栈!

请选择输入方向,正向(0),方向(1),结束(2): 2 (回车)Enter ‘y’to continue :y (回车)

六、调试小结

函数init (sqstack *s) 中少了一条s=(sqstack *)malloc(sizeof(sqstack))语句,这就导致了栈的内存空间无法分配,所以执行出错。

在程序中多加了get (sqstack *s,int l)、check (sqstack *s)、print (sqstack *s) 三个函数以便与栈的输入输出以及对栈的检测(不出栈)。

为了在栈的输入之前判断是否已经建栈,在主函数中定义了一个l并定义为0,当l = 0时表示还未建栈,l = 1时表示已经建栈。所以只要将l的值传入get (sqstack *s,int l)函数中就可以判断在此之前是否已经建栈。

七、疑问

对标志l的赋值只能放在建栈函数s=init(s)之后,而不能放在它的前面。如下:printf("\n");

s=init(s);

printf("Enter 'y' to contunie :");

scanf("%s",&i); 正确

printf("\n");

l=1;

system("cls");

printf("\n");

l=1;

s=init(s);

printf("Enter 'y' to contunie :");

scanf("%s",&i); 错误!l的值任然为0,不赋值为1

printf("\n");

system("cls");

数据结构实验二_栈的基本操作

青岛理工大学课程实验报告

s->top=s->base; s->stacksize=stack_init_size; return 1; } int Push(sqstack *s,int e) { if(s->top-s->base>=s->stacksize) { s->base=(int *)realloc(s->base,(s->stacksize+stackincrement)*sizeof(int)); if(!s->base) return 0; s->top=s->base+s->stacksize; s->stacksize+=stackincrement; } *(s->top++)=e; return e; } int Pop(sqstack *s,int e) { if(s->top==s->base) return 0; e=*--s->top; return e; } int stackempty(sqstack *s) { if(s->top==s->base) { return 1; } else Push(s,n%flag); n=n/flag; } while(!stackempty(s)) { e=Pop(s,e); switch(e) { case 10: printf("A"); break; case 11: printf("B"); break; case 12: printf("C"); break; case 13: printf("D"); break; case 14: printf("E"); break; case 15: printf("F"); break; default: printf("%d",e); } } printf("\n"); return 0; } int main() { sqstack s; StackInit(&s); conversion(&s); return 0; }

数据结构中栈的介绍

数据结构中栈的介绍 1.栈的概念 栈(Stack)是一种特殊的表,这种表只在表的一端进行插入和删除操作。允许插入和删除数据元素的这一端称为栈顶;而另一固定的一端称为栈底。不含任何元素的栈称为空栈。 栈的修改是按后进先出的原则进行的。栈又称为后进先出(Last In First Out)表,简称为LIFO表。 如图1所示:假设一个栈S中的元素为a n,a n-1,..,a1,则称a1为栈底元素,a n为栈顶元素。 图1 图 2 2.栈的存储与操作 由于栈是一个特殊的表,可以用一维数组来实现栈。同时设立指针t(称为栈顶指针)来指示栈顶元素的当前位置。 我们用一个数组s[1..m]来表示一个栈时,将栈底固定在数组的底部,即s[1]为最早入栈的元素,并让栈向数组上方(下标增大的方向)扩展。当t=0时,表示这个栈为一个空栈。当t=m时,表示这个栈已满。 可以用下列方式定义栈: const m=栈表目数的上限; type stack=array[1..m] of stype; {栈的数据类型} var s:stack; t:integer; {栈顶指针} 进栈、出栈操作的过程和函数(假设栈元素的数据类型为整型): (1)进栈过程(push) ①若t≥m时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②); ②置t=t+1(栈指针加1,指向进栈地址); ③S(t)=x,结束(x为新进栈的元素); procedure push(var s:stack; x:integer;var t:integer); begin if t=m then writeln('overflow') else begin

机械设计常用资料大全

机械设计常用资料大全》(Mechanical design common documents daqo)1.0 这么多的机械设计用资料,对你进行机械设计或者学习,有非常大的帮助,省去了你查找资料的时间。本资源对机械设计的资料进行了分类,极大地方便了你下载需要参考的资料,同时也会对你学习机械专业知识,有一个整体性的了解,可以帮助你应该加强哪部分内容的学习! 供在校大学生或机械类工程技术人员使用。 一、手册类 机械设计课程设计手册(第三版) 机械设计手册(第五版)第1卷 机械设计手册(第五版)第2卷 机械设计手册(第五版)第3卷 机械设计手册(第五版)第4卷 机械设计手册(第五版)第5卷 机械设计手册.(新版).第1卷 机械设计手册.(新版).第2卷 机械设计手册.(新版).第3卷 机械设计手册.(新版).第4卷 机械设计手册.(新版).第5卷 机械设计手册.(新版).第6卷 [精密加工技术实用手册].精密加工技术实用手册 包装机械选用手册上-印刷实务 包装机械选用手册下-印刷实务 机电一体化专业必备知识与技能手册 机械工程师手册.第二版 机械加工工艺师手册 机械设计、制造常用数据及标准规范实用手册 机械制图手册(清晰版) 机械制造工艺设计简明手册 联轴器、离合器与制动器设计选用手册 实用机床设计手册 运输机械设计选用手册.上册 运输机械设计选用手册.下册 中国机械设计大典数据库 最新金属材料牌号、性能、用途及中外牌号对照速用速查实用手册 最新实用五金手册(修订本) 最新轴承手册 二、机构类 高等机构设计 机构参考手册 机构创新设计方法学 机构设计丛书.凸轮机构设计 机构设计实用构思图册-verygood

顺序栈的基本操作讲解

遼穿紳範大學上机实验报告 学院:计算机与信息技术学院 专 业 : 计算机科学与技术(师 范) 课程名称:数据结构 实验题目:顺序栈的基本操作 班级序号:师范1班 学号:201421012731 学生姓名:邓雪 指导教师:杨红颖 完成时间:2015年12月25号 一、实验目的: 1 ?熟悉掌握栈的定义、结构及性质; 2. 能够实现创建一个顺序栈,熟练实现入栈、出栈等栈的基本操作; 3?了解和掌握栈的应用。 二、实验环境: Microsoft Visual C++ 6.0

三、实验内容及要求: 栈是一种特殊的线性表,逻辑结构和线性表相同,只是其运算规则有更多的限制,故又称为受限的线性表。 建立顺序栈,实现如下功能: 1. 建立一个顺序栈 2. 输出栈 3. 进栈 4. 退栈 5. 取栈顶元素 6. 清空栈 7. 判断栈是否为空 进行栈的基本操作时要注意栈”后进先出”的特性。 四、概要设计: 1、通过循环,由键盘输入一串数据。创建并初始化一个顺序栈。 2、编写实现相关功能函数,完成子函数模块如下。 3、调用子函数,实现菜单调用功能,完成顺序表的相关操作

五、代码: #include #include #define maxsize 64 typedef int datatype; //定义结构体typedef struct { datatype data[maxsize]; int top; }seqstack; //建立顺序栈seqstack *SET(seqstack *s) { int i; s=(seqstack*)malloc(sizeof(seqstack)); s->top=-1; printf(" 请输入顺序栈元素(整型,以scanf("%d",&i); do{ s->top++; s->data[s->top]=i; scanf("%d",&i); 0 结束):"); }while(i!=0); printf(" 顺序栈建立成功\n"); return s; } //清空栈void SETNULL(seqstack *s) { s->top=-1;} //判断栈空 int EMPTY(seqstack *s) { if(s->top>=0) return 0; else return 1;} //进栈 seqstack *PUSH(seqstack *s) { int x; printf(" 你想要插入的数字:"); scanf("%d",&x); if(s->top==maxsize-1) { printf("overflow"); return NULL; } else {

数据结构_实验三_栈和队列及其应用

实验编号:3四川师大《数据结构》实验报告2016年10月29日 实验三栈与队列及其应用_ 一.实验目得及要求 (1)掌握栈与队列这两种特殊得线性表,熟悉它们得特性,在实际问题背景下灵活运用它们; (2)本实验训练得要点就是“栈”得观点及其典型用法; (3)掌握问题求解得状态表示及其递归算法,以及由递归程序到非递归程序得转化方法。 二.实验内容 (1)编程实现栈在两种存储结构中得基本操作(栈得初始化、判栈空、入栈、出栈等); (2)应用栈得基本操作,实现数制转换(任意进制); (3)编程实现队列在两种存储结构中得基本操作(队列得初始化、判队列空、入队列、出队列); (4)利用栈实现任一个表达式中得语法检查(括号得匹配)。 (5)利用栈实现表达式得求值。 注:(1)~(3)必做,(4)~(5)选做。 三.主要仪器设备及软件 (1)PC机 (2)Dev C++ ,Visual C++, VS2010等 四.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1)编程实现栈在两种存储结构中得基本操作(栈得初始化、判栈空、入栈、出栈等); A、顺序储存: ?代码部分: //Main、cpp: #include"SStack、h" int main() { SqStack S; SElemType e;

int elect=1; InitStack(S); cout << "已经创建一个存放字符型得栈" << endl; while (elect) { Muse(); cin >> elect; cout << endl; switch (elect) { case 1: cout << "input data:"; cin >> e; Push(S, e); break; case 2: if(Pop(S, e)) {cout << e <<" is pop"<< endl; } else{cout<<"blank"<

数据结构栈的定义及基本操作介绍

北京理工大学珠海学院实验报告 ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY 班级软件工程3班学号 150202102309姓名郭荣栋 指导教师余俊杰成绩 实验题目栈的实现与应用实验时间 一、实验目的、意义 (1)理解栈的特点,掌握栈的定义和基本操作。 (2)掌握进栈、出栈、清空栈运算的实现方法。 (3)熟练掌握顺序栈的操作及应用。 二、实验内容及要求 1.定义顺序栈,完成栈的基本操作:建空栈、入栈、出栈、取栈顶元素(参见教材45页)。 2. 调用栈的基本操作,将输入的十进制数转换成十六进制数。 3. 调用栈的基本操作,实现表达式求值,如输入3*(7-2)#,得到结果15。 三、实验结果及分析 (所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。)

四、程序清单(包含注释) 1、2. #include #include #include using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 #define INCREASEMENT 10 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10

typedef int SElemType; typedef int Status; typedef struct{ SElemType *base; SElemType *top; int stacksize; }Sqstack; void StackTraverse(Sqstack S) { while (S.top != S.base) { cout << *(S.top-1) << endl; S.top--; } } Status InitStack(Sqstack &S){ S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base){ exit(OVERFLOW); }

数据结构栈的应用(迷宫求解)

栈的应用 迷宫求解 任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出; 源代码: #include #include /*数据定义*/ typedefenum { ERROR, OK } Status; typedefstruct { int row; //row表示"行"号 int line; //line表示"列"号 }PosType; //位置的元素类型 typedefstruct { intord; //该通道在路径上的"序号" PosType seat; //通道块在迷宫中的"坐标位置" int di; //从此通道走向下以通道块的"方向" }SElemType; //栈的元素类型 typedefstruct { SElemType * base; SElemType * top; intstacksize; }SqStack; /*函数原型说明*/ Status InitStack(SqStack&S); //创建一个空栈S Status Push(SqStack&S,SElemType&a); //插入新元素a Status Pop(SqStack&S,SElemType&a); //删除栈顶元素,a返回其值 Status StackEmpty(SqStack S); //检查是否空栈 Status MazePath(int maze[12][12],SqStack&S, PosType start, PosType end); //找通路 void Initmaze(int maze[12][12],intx,int y); //初始化迷宫 void printmaze(int maze[12][12],intx,int y); //显示迷宫 Status Pass(int maze[12][12],PosTypeCurPos); //判断当前位置是否可通 void Markfoot(int maze[12][12], PosTypeCurPos); //标记当前位置不可通 PosTypeNextPos(PosTy peCurPos, intDir); //进入下一位置 void printpath(int maze[12][12],SqStackS,intx,inty,PosTypestart,PosType end); //显示通路 /*主函数*/ void main (void) { PosTypestart,end; int t=0; SqStack S;

结构设计常用数据

结构设计常用数据

————————————————————————————————作者:————————————————————————————————日期: ?

混凝土结构设计规范 表3.4.3受弯构件的挠度限值 构件类型挠度限值 吊车梁手动吊车l0/500电动吊车l0/600 屋盖、楼盖及楼梯构件 当l0<7m时 l0/200(l0/2 50) 当7m≤l0≤9 m时 l0/250(l0/ 300) 当l0>9m时 l0/300(l0/4 00) 表3.3.5 结构构件的裂缝控制等级及最大裂缝宽度的限值(mm) 环境类别钢筋混凝土结构 预应力混凝土结 构 裂缝控 制等级 w lim 裂缝控 制等级 w lim 一 三级0.30 (0.4 0) 三级 0.20 二a 0.200.10 二b 二级——三a、三一级——

b 表3.3.2混凝土结构的环境类别环境类 别 条件 一室内干燥环境; 无侵蚀性静水浸没环境 二a 室内潮湿环境; 非严寒和非寒冷地区的露天环境; 非严寒和非寒冷地区与无侵蚀性的水或土壤直接接触的环境; 严寒和寒冷地区的冰冻线以下与无侵蚀性的水或土壤直接接触的环境 二b 干湿交替环境; 水位频繁变动环境; 严寒和寒冷地区的露天环境; 严寒和寒冷地区冰冻线以上与无侵蚀性的水或土壤直接接触的环境 三a 严寒和寒冷地区冬季水位变动区环境; 受除冰盐影响环境; 海风环境 三b 盐渍土环境;

受除冰盐作用环境; 海岸环境 四 海水环境 五 受人为或自然的侵蚀性物质影响的环境 表3.5.3 结构混凝土材料的耐久性基本要求 环境等级 最大水胶比 最低强度等级 最大氯离子含量(%) 最大碱含量(k g/m 3) 一 0.60 C 20 0.30 不限制 环境等级 最大水胶比 最低强度等级 最大氯离子含量(%) 最大碱含量(kg/m 3) 二a 0.55 C25 0.20 3.0 二b 0.50(0.55) C30(C 25) 0.15 三a 0.45(0.5 0) C35(C30) 0.15 三b 0.40 C 40 0.10 表8.1.1 钢筋混凝土结构伸缩缝最大间距(m) 结构类型 室内或土 露天

数据结构栈的基本操作,进栈,出栈

第五次实验报告—— 顺序栈、链栈的插入和删除一需求分析 1、在演示程序中,出现的元素以数字出现定义为int型, 2、演示程序在计算机终端上,用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在终端上 3、顺序栈的程序执行的命令包括如下: (1)定义结构体 (2)顺序栈的初始化及创建 (3)元素的插入 (4)元素的删除 (5)顺序栈的打印结果 3、链栈的程序执行的命令包括如下: (1)定义结构体 (2)链栈的初始化及创建 (3)元素的插入 (4)元素的删除 (5)链栈的打印结果 二概要设计 1、顺序栈可能需要用到有序表的抽象数据类型定义: ADT List{ 数据对象:D={ai|ai∈ElemL, i=1,2,...,n, n≥0} 数据关系:R1={|ai-1,ai ∈D, i=2,...,n } 基本操作: InitStack(SqStack &S) 操作结果:构造一个空栈 Push(L,e) 操作结果:插入元素e为新的栈顶元素

Status Pop(SqStack &S) 操作结果:删除栈顶元素 }ADT List; 2、链栈可能需要用到有序表的抽象数据类型定义: ADT List{ 数据对象:D={ai|ai∈ElemL, i=1,2,...,n, n≥0} 数据关系:R1={|ai-1,ai ∈D, i=2,...,n } 基本操作: LinkStack(SqStack &S) 操作结果:构造一个空栈 Status Push(L,e) 操作结果:插入元素e为新的栈顶元素 Status Pop(SqStack &S) 操作结果:删除栈顶元素 }ADT List; 3、顺序栈程序包含的主要模块: (1) 已给定的函数库: (2)顺序栈结构体: (3)顺序栈初始化及创建: (4)元素插入 (5)元素删除

数据结构实验—栈及其应用

《算法与数据结构》课程实验报告

一、实验目的 1.熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈 的基本操作在栈的顺序存储结构。 2.实现栈的顺序存储结构,通过实验深入理解栈的操作特点。 二、实验内容及要求 1.实现栈的存储结构及相关操作:进栈、出栈、取栈顶元素等。 2.使用该栈完成对一个字符串的逆序输出。 3.使用该栈完成判断表达式的括号是否匹配。 4.对算术表达式求值。 三、系统分析 (1)数据方面:该栈数据元素类型采用浮点型,在此基础上进行栈的基本操作,并可将栈中数据使用文本文档保存。在栈的应用中,采用的是存储字符元素类型的栈,并进行对字符的相关操作。 (2)功能方面:能实现栈的一些基本操作,主要包括: 1.进栈操作:若栈不满,则将元素x插入至栈的栈顶,若栈满则进行溢出 处理。 2.出栈操作:若栈不空,则函数返回该栈栈顶的元素,并且栈顶指针退1。 3.获取栈顶元素:若栈不空,则函数返回栈顶元素。 4.判断栈是否为空、判断栈是否满。 5.计算栈中元素个数:直接返回栈中元素个数。 6.清空栈内容:将栈顶指针赋为初始值。 7.保存数据:将栈中元素数据保存至文本文档中。 四、系统设计 (1)设计的主要思路 顺序栈可以采用顺序表作为其存储表示,为此,在顺序栈的声明中用顺序表定义它的存储空间。存放栈元素的数组的头指针为*elements,该数组最大能允许存放元素个数为maxSize,当前栈顶位置由数组下标指针top知识。并规定如果栈不空时,elements[0]为栈中第一个元素。由于实验中还需完成栈的相关应用,故使用两个菜单分别完成栈的基本操作与栈的应用调试。 (2)数据结构的设计 顺序栈定义为只允许在表的末端进行插入和删除的线性表。允许插入和删除的一端叫做栈顶,而不允许插入和删除的另一端叫做栈底。当栈中没有任何元素时则成为空战。即栈又被称为后进先出的线性表,故与线性表的相关操作类似,

数据结构——顺序栈的基本操作

#include using namespace std; # define STACK_INIT_SIZE 100 # define STACKINCREMENT 10 typedef struct { int * base; int * top; int stacksize;//当前栈可使用的最大容量 } SqStack; void InitStack(SqStack &S)//构造一个空栈 { S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!S.base) {cout<<"存储分配失败!!!"<=S.stacksize) { S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int)); if(!S.base) cout<<"存储分配失败!!!"<

数据结构利用栈实现递归

利用栈实现递归参考程序1(Turbo2.0环境): #define MAXSIZE 100 #include struct stack{ int data[MAXSIZE]; int top; }; void init(struct stack *s){ s->top=-1; } int empty(struct stack *s){ if(s->top==-1) return 1; else return 0; } void push(struct stack *s,int i){ if(s->top==MAXSIZE-1){ printf("Stack is full\n"); return; } s->top++; s->data[s->top]=i; } int pop(struct stack *s){ if(empty(s)){ printf("stack is empty"); return -1; } return(s->data[s->top--]); } void trans(int num){ struct stack s; int k; init(&s); while(num){ k=num%16; push(&s,k); num=num/16; } while(!empty(&s)){ k=pop(&s); if(k<10)

printf("%d",k); else printf("%c",k+55); } printf("\n"); } main(){ int num; clrscr(); printf("Input a num,-1 to quit:\n"); scanf("%d",&num); while(num!=-1){ trans(num); scanf("%d",&num); } } 参考程序2:(C++/VC环境) #define STACK_INIT_SIZE 100//存储空间初始分配量 #define OVERFLOW -1 #define OK 1 #define STACKINCREMENT 10//存储空间分配增量 #define ERROR 0 #define TRUE 1 #define FALSE 0 #include "stdio.h" #include "stdlib.h" #include "malloc.h" #include "iostream.h" typedef int status; typedef char SElemType; typedef struct{//顺序栈的定义 SElemType *base; SElemType *top; int stacksize; }SqStack; status InitStack(SqStack &S){//构造一个空栈S S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base)exit(OVERFLOW);//存储分配失败 S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; }

(完整word版)顺序栈基本操作实验报告

数据结构实验三 课程数据结构实验名称顺序栈基本操作第页 专业班级学号 姓名 实验日期:年月日评分 一、实验目的 1.熟悉并能实现栈的定义和基本操作。 2.了解和掌握栈的应用。 二、实验要求 1.进行栈的基本操作时要注意栈"后进先出"的特性。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上交实验报告。 三、实验内容 1.编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。 2.编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。 主要功能描述如下: (1)从键盘上输入表达式。 (2)分析该表达式是否合法: ?a) 是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。 ?b) 是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。 ?c) 若是其它字符,则返回错误信息。 (3)若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。 程序中应主要包含下面几个功能函数: ?l void initstack():初始化堆栈 ?l int Make_str():语法检查并计算

?l int push_operate(int operate):将操作码压入堆栈 ?l int push_num(double num):将操作数压入堆栈 ?l int procede(int operate):处理操作码 ?l int change_opnd(int operate):将字符型操作码转换成优先级 ?l int push_opnd(int operate):将操作码压入堆栈 ?l int pop_opnd():将操作码弹出堆栈 ?l int caculate(int cur_opnd):简单计算+,-,*,/ ?l double pop_num():弹出操作数 四、实验步骤 (描述实验步骤及中间的结果或现象。在实验中做了什么事情,怎么做的,发生的现象和中间结果) 第一题: #include using namespace std; #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 #define OVERFLOW -1 #define OK 1 #define NO -1 #define NULL 0 typedef int Status; typedef char SElemType; typedef struct { SElemType *base; //在栈构造之前和销毁之后,base的值为NULL SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 } SqStack; Status Initstack(SqStack &S)//构造一个空栈S { S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize= STACK_INIT_SIZE; return OK; }//InitStack Status StackEmpty(SqStack &S) { if(S.base==S.top)

数据结构 用栈 实现 背包问题

数据结构用栈实现背包问题 #include using namespace std; #define CAPACITY 10; //设置包的容量 //#define MaxSize 10; //包中可放物品最大数目 struct Myitem { int item_size; int item_id; }; typedef Myitem ElemType; struct Knapsack { ElemType item[10]; int Length; int top; }; void InitKnap(Knapsack &K); //函数1----将包清空 void Push_in(Knapsack &K,int item,int id) ; //函数2----将物品放入包中 void Pop_out(Knapsack &K); //函数3----将最近放进的物品拿出来 void ShowKnap(Knapsack &K); //函数4----依次展示包中的物品 void Knapsack_Solvation(Knapsack &K,int Items[],int Len); //函数5----寻找能刚好占据包所有空间的物品组合 //***主函数***// void main() { int Len; int Items[]={1,3,4,5,6,7}; //准备好物品 Len=6; Knapsack knapSack; InitKnap(knapSack); //初始化 Knapsack_Solvation(knapSack,Items,Len);

结构设计新手的七种学习方法(免费分享)

结构设计新手的七种学习方法 第一种武器:熟悉结构设计的任务和内容 如果你的职业规划是结构设计,了解民用建筑结构设计的深度很重要,起码要知道结构设计不同阶段的不同设计内容,这样可以做到有的放矢,心中有数。如果连起码的设计内容都不是这里缺一点就是那里漏一点,想不被审图办打回来都难! 结构新手必看--民用建筑结构设计深度及图样 https://www.wendangku.net/doc/e718752554.html,/forum.php?mod=viewthread&tid=35189&fromuid=991887 05G104民用建筑结构初步设计深度及图样 04G103民用建筑结构施工图设计深度及图样 第二种武器:扎实的结构理论基础知识要用结构理论武装自己的头脑,切忌盲目上阵: 大学本科的材料力学、结构力学、混凝土设计原理、工程结构抗震设计、土力学与地基基础等等这些和结构设计紧密相关的主干课程务必要重视。真正的高手一定是具备理论和实践相结合的素质,但如果这些理论不过关的话何谈理论与实践相结合呢?很多学生在学校的时候总是觉得学校的课程枯燥无味,不知道学这些知识和实际的设计有什么样的联系。其实当你真正地涉足设计的时候却往往发现:原来我们90%的设计总是可以从我们的大学课程中找到它的原型。我们很多学员都是在开始设计的过程中发现自己大学的主干课程学得不扎实然后恶补,与其亡羊补牢,不如未雨绸缪。如果你的职业规划是结构设计,这些和结构设计紧密相关的主干课程务是一个必须跨过去的坎,任何抱着侥幸心理而又想做好结构设计的思想都是不切实际的,在这个原则问题上是无法妥协也是没有捷径而言的。比如结构新人在画楼梯大样配筋时经常容易犯图一的错误,之所以犯这样的错误就是因为对钢筋和混凝土的材料特性不了解。

数据结构(C语言)栈的基本操作

实验名称栈的基本操作 实验目的 掌握栈这种抽象数据类型的特点及实现方法。 实验内容 从键盘读入若干个整数,建一个顺序栈或链式栈,并完成下列操作: (1)初始化栈; (2)判栈为空; (3)出栈; (4)入栈。 算法设计分析 (一)数据结构的定义 struct stackNode{ int data; struct stackNode *nextPtr; }; typedef struct stackNode listStact; typedef listStact *stackNodePtr; (二)总体设计 程序由主函数、入栈函数,出栈函数,删除函数判官是否为空函数和菜单函数组成。 (1)主函数:调用各个函数以实现相应功能

(三)各函数的详细设计: Function1: void instruct() //菜单 (1):使用菜单显示要进行的函数功能; Function2:void printStack(stackNodePtr sPtr) //输出栈 (1):利用if判断栈是否为空; (2):在else内套用while(头指针不为空条件循环)循环输出栈元素; Function3:void push(stackNodePtr *topPtr,int value //进栈 (1):建新的头指针; (2):申请空间; (3):利用if判断newPtr不为空时循环进栈 (4):把输入的value赋值给newPtr,在赋值给topPtr,再指向下一个位置; Function4:int pop(stackNodePtr*topPtr) //删除 (1):建新的头指针newPtr; (2):利用if判断newPtr是否为空,再删除元素。 (3):把topPtr等于newPtr,把头指针指向的数据赋值给topValue,输出要删除的数据值,头指针指向下一个位置,并清空newPtr; (4):完成上述步骤后,return toPvalue,返回;

数据结构答案第3章栈学习指导

第3章栈 3.1 知识点分析 1.栈的基本概念 (1)栈是一种特殊的、只能在表的一端进行插入或删除操作的线性表。允许插入、删除的一端称为栈顶,另一端称为栈底。 (2)栈的逻辑结构和线性表相同,其最大特点是“后进先出”。 (3)栈的存储结构有顺序栈和链栈之分,要求掌握栈的C语言描述方法。 (4)重点掌握在顺序栈和链栈上实现:进栈、出栈、读栈顶元素、判栈空和判栈满等基本操作。 (5)熟悉栈在计算机的软件设计中的典型应用,能灵活应用栈的基本原理解决一些实际应用问题。 2.顺序栈 顺序栈是利用地址连续的存储单元依次存放从栈底到栈顶的元素,同时附设栈顶指针来指示栈顶元素在栈中的位置。 (1)用一维数组实现顺序栈 设栈中的数据元素的类型是字符型,用一个足够长度的一维数组s来存放元素,数组的最大容量为MAXLEN,栈顶指针为top,则顺序栈可以用C(或C++)语言描述如下:#define MAXLEN 10 // 分配最大的栈空间 char s[MAXLEN];// 数据类型为字符型 int top;// 定义栈顶指针 (2)用结构体数组实现顺序栈 顺序栈的结构体描述: #define MAXLEN 10 // 分配最大的栈空间 typedef struct // 定义结构体 { datatype data[MAXLEN];// datatype可根据用需要定义类型 int top;// 定义栈顶指针 }SeqStack; SeqStack *s;// 定义S为结构体类型的指针变量 (3)基本操作的实现要点 (a)顺序栈进栈之前必须判栈是否为满,判断的条件:s->top==MAXLEN–1。 (b)顺序栈出栈之前必须判栈是否为空,判断的条件:s->top==–1。 (c)初始化栈(置栈空):s->top==–1。 (d)进栈操作: if (s->top!=MAXLEN–1)// 如果栈不满 { s->top++;// 指针加1 s->data[s->top]=x;// 元素x进栈 } (e)出栈操作: if (s->top!=–1)// 如果栈不空 { *x=s->data[s->top];// 出栈(即栈顶元素存入*x) s->top––;// 指针加1 } (f)读栈顶元素 if (s->top!=–1)// 如果栈不空 return(s->data[s->top]);// 读栈顶元素,但指针未移动

结构设计中常见问题及解决办法之一结构设计总则

结构设计中常见问题及解决办法之一结构设计总则结构设计中常见问题及解决办法之一 结构设计总则 目录、编制说明 一、结构设计总则 1.1总说明及图纸设计文件 1.2计算书完整性问题 1.3计算参数及荷载取值 二、地基处理及基础设计 三、钢结构 四、钢筋混凝土结构 五、结构加固 编制说明 1、根据现行国家有关规范、规程,对工程设计中由于设计人员的考虑不周和对规范、规程的理解不够全面,造成的一些不当做法和错误,以及在施工图设计文件审查中常出现的问题,进行汇总、整理、分析,并提出改进措施及依据,从而加强设计人员对规范及规程全面、准确的理解,避免类似错误的发生,合理和优化设计,提高设计质量。 2、主要编制依据 《建筑结构可靠度设计统一标准》GB50068-2001 《建筑工程抗震设防分类标准》GB50223-2008 《岩土工程勘察规范》GB50021-2001(2009年修订)

《人民防空地下室设计规范》GB50038-2005 《地下工程防水技术规范》GB50108-2008 《建筑结构荷载规范》GB50009-2012 《建筑地基基础设计规范》GB50007-2011 《建筑地基处理技术规范》JGJ79-2012J220-2012 《建筑桩基技术规范》JGJ94-2008 《建筑抗震设计规范》GB50011-2010 《混凝土结构设计规范》GB50010-2010 《钢结构设计规范》GB50017-2003 《门式刚架轻型房屋钢结构技术规范》GB51022-2015 《高层建筑混凝土结构技术规程》JGJ3-2010J186-2010 《建筑工程设计文件编制深度规定》建质函[2016]247号 《施工图设计文件审查要点》建质[2013]87号 《民用建筑工程设计常见问题分析及图示》图集 《建筑结构设计问答及分析》 《高层建筑混凝土结构技术规程应用及分析》 《建筑抗震设计规范应用与分析》 《建筑地基基础设计方法及实例分析》 《PKPM产品使用手册及技术条件》 《盈建科产品使用手册及技术条件》 一、结构设计总则 1.1总说明及图纸设计文件 (1)设计依据和质量验收应遵循的工程建设标准的名称、编号与版本号正确性。

数据结构 栈和队列的基本操作实现及其应用

实验二栈和队列的基本操作实现及其应用 一、实验目的 1、熟练掌握栈和队列的基本操作在两种存储结构上的实现。 2、会用栈和队列解决简单的实际问题。 二、实验内容(可任选或全做) 题目一、试写一个算法,判断依次读入的一个以@为结束符的字符序列, 是否为回文。所谓“回文“是指正向读和反向读都一样的一字符串,如“321123”或“ableelba”。 相关常量及结构定义: # define STACK_INIT_SIZE 100 # define STACKINCREMENT 10 # define OK 1 # define ERROR 0 typedef int SElemType; //栈类型定义 typedef struct SqStack { SElemType *base; SElemType *top; int stacksize; }SqStack; 设计相关函数声明: 判断函数:int IsReverse() 栈:int InitStack(SqStack &S ) int Push(SqStack &S, SElemType e ) int Pop(SqStack &S,SElemType &e) int StackEmpty(s) 题目二、编程模拟队列的管理,主要包括: 出队列、 入队、 统计队列的长度、 查找队列某个元素e、 及输出队列中元素。 [实现提示]:参考教材循环队列的有关算法,其中后两个算法参考顺序表的实现。 题目三、Rails

Description There is a famous railway station in PopPush City. Country there is incredibly hilly. The station was built in last century. Unfortunately, funds were extremely limited that time. It was possible to establish only a surface track. Moreover, it turned out that the station could be only a dead-end one (see picture) and due to lack of available space it could have only one track. The local tradition is that every train arriving from the direction A continues in the direction B with coaches reorganized in some way. Assume that the train arriving from the direction A has N <= 1000 coaches numbered in increasing order 1, 2, ..., N. The chief for train reorganizations must know whether it is possible to marshal coaches continuing in the direction B so that their order will be a1, a2, ..., aN. Help him and write a program that decides whether it is possible to get the required order of coaches. You can assume that single coaches can be disconnected from the train before they enter the station and that they can move themselves until they are on the track in the direction B. You can also suppose that at any time there can be located as many coaches as necessary in the station. But once a coach has entered the station it cannot return to the track in the direction A and also once it has left the station in the direction B it cannot return back to the station. Input The input consists of blocks of lines. Each block except the last describes one train and possibly more requirements for its reorganization. In the first line of the block there is the integer N described above. In each of the next lines of the block there is a permutation of 1, 2, ..., N. The last line of the block contains just 0. The last block consists of just one line containing 0. Output

相关文档
相关文档 最新文档