数据结构栈或队列的基本操作文档格式.docx

上传人:b****6 文档编号:21401504 上传时间:2023-01-30 格式:DOCX 页数:20 大小:20.21KB
下载 相关 举报
数据结构栈或队列的基本操作文档格式.docx_第1页
第1页 / 共20页
数据结构栈或队列的基本操作文档格式.docx_第2页
第2页 / 共20页
数据结构栈或队列的基本操作文档格式.docx_第3页
第3页 / 共20页
数据结构栈或队列的基本操作文档格式.docx_第4页
第4页 / 共20页
数据结构栈或队列的基本操作文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

数据结构栈或队列的基本操作文档格式.docx

《数据结构栈或队列的基本操作文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构栈或队列的基本操作文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

数据结构栈或队列的基本操作文档格式.docx

✧栈、队列的算法是后续实验的基础(广义表、树、图、查找、排序等)。

4.判断“回文”问题(实验类型:

所谓回文,是指从前向后顺读和从后向前倒读都一样的字符串。

例如,did;

pop;

Iwasable与elbasawI等等。

编写程序,利用栈结构判断一个字符串是否是“回文”。

✧从左向右遇到的字符,若和栈顶元素比较,若不相等,字符入栈,若相等,出栈。

如此继续,若栈空,字符串是“回文”,否则不是。

5.用递归和非递归两种方法实现自然数的拆分(实验类型:

任何大于1的自然数n,总可以拆分成若干大于等于1的自然数之和。

例:

n=44=1+34=1+1+24=1+1+1+14=2+2

✧采用递归和非递归两种方法实现

✧利用交换率得出的拆分看作相同的拆分。

✧递归算法:

⏹用数组a[],a[k]中存储已完成的一种拆分

⏹a[k]能否再拆分取决于a[k]/2是否大于等于a[k-1];

⏹递归过程有两个参数:

n表示要拆分数值的大小;

k表示n存储在数组元素a[k]中。

✧非递归算法:

(1)栈为两个数组a[],b[],ax,bx表示两个栈的栈顶元素;

初始化:

a[1]=1,b[1]=n,i=1,ax=a[i],bx=b[i]

(2)若i<

>

1orax<

bx,重复

◆若ax<

bx/2,进栈并取栈顶元素,返回

(2)

i=i+1;

a[i]=ax,b[i]=bx-ax,bx=b[i]

◆若ax=bx,则数出拆分,退栈兵修改栈顶元素,返回

(2)

i=i-1;

a[i]=a[i]+1,ax=a[i],bx=b[i]

◆其余情况,bx/2<

ax<

bx,修改栈顶元素,返回

(2)

a[i]=a[i]+1,ax=a[i]

实验内容(应包括实验题目、实验要求、实验任务等)

附录(可包括源程序清单或其它说明)

实验源程序代码如下:

第一题:

#include<

stdio.h>

stdlib.h>

#include<

iostream.h>

#defineStackSize100

typedefintStackType;

typedefstruct{

StackTypedata[StackSize];

inttop;

}Seq_stack;

Seq_stack*Creatstack()

{

Seq_stack*s;

s=(Seq_stack*)malloc(sizeof(Seq_stack));

if(s!

=NULL)

{

s->

top=-1;

returns;

}

else

cout<

<

"

申请内存失败!

endl;

exit(0);

}

/*voidIf_Empty(Seq_stack*s)///////////////////判断是否为空栈

if(s->

top==-1)

此栈为空栈!

此栈不是空栈!

}*/

voidPush(Seq_stack*s,StackTypem)//////////////////入栈操作

top==StackSize-1)

此栈已满终止程序!

!

top++;

data[s->

top]=m;

StackTypePop(Seq_stack*s)

StackTypetemp;

程序终止"

temp=s->

top];

top--;

returntemp;

voidconver(intN,inti)////数制转换

StackTypem;

s=Creatstack();

while(N)

Push(s,N%i);

///////余数存入栈

N=N/i;

/////商作为被除数继续循环

while(s->

top>

-1)

m=Pop(s);

m;

cout<

voidmain()

intN,i,j;

for(;

;

请输入要进行转换的十进制整数:

cin>

N;

请输入将要转换成几进制数"

i;

您将要转换成"

i<

进制数"

conver(N,i);

是否继续?

1.是2.退出"

j;

if(j==2)

break;

else

continue;

第二题:

typedefstructNode{

StackTypedata;

structNode*next;

}Stack_node;

intpriority[8][8]={

3,3,1,1,1,1,3,3,

3,3,3,3,3,1,3,3,

1,1,1,1,1,1,2,2,

3,3,3,3,3,0,2,2,

1,1,1,1,1,1,0,2};

Stack_node*Push(Stack_node*t,StackTypem)//////////////创建同时进行入栈操作

Stack_node*s;

s=(Stack_node*)malloc(sizeof(Stack_node));

if(s)

data=m;

//////m入栈

next=t;

t=s;

内存不足,程序终止"

returnt;

Stack_node*Pop(Stack_node*t,StackType*n)

Stack_node*temp;

if(!

t)

此栈为空,出栈操作失败!

returnNULL;

temp=t;

*n=t->

data;

t=t->

next;

free(temp);

///释放删除节点所占内存空间

returnt;

StackTypeGet_top(Stack_node*t)///////读取栈中数据

此栈为空,无法读取!

return0;

returnt->

intsub(StackTypex)

switch(x)

case'

+'

:

-'

return1;

*'

return2;

/'

return3;

%'

return4;

('

return5;

)'

return6;

#'

return7;

StackTypex1,x2,i,j,op,temp;

charch;

Stack_node*OPTR=NULL;

////算符栈

Stack_node*OPND=NULL;

////对象栈

OPTR=Push(OPTR,'

);

////将开始符号“#”压入栈中;

请输入要进行的运算表达式:

ch=getchar();

while(!

(ch=='

&

&

Get_top(OPTR)=='

))

if(ch=='

||ch=='

{

i=sub(Get_top(OPTR));

j=sub(ch);

if(priority[i][j]==3)

{

OPTR=Pop(OPTR,&

op);

OPND=Pop(OPND,&

x2);

x1);

switch(op)

{

case'

OPND=Push(OPND,x1+x2);

break;

OPND=Push(OPND,x1-x2);

OPND=Push(OPND,x1*x2);

OPND=Push(OPND,x1/x2);

OPND=Push(OPND,x1%x2);

}

continue;

}

if(priority[i][j]==1)////栈内运算符优先级小于栈外运算符优先级

OPTR=Push(OPTR,ch);

if(priority[i][j]==2)

temp);

}

OPND=Push(OPND,ch-48);

////将数字字符转换为数字压入栈中

ch=getchar();

表达式的值为:

Get_top(OPND)<

第三题:

#defineMAX100

typedefstructStack

intdata[MAX];

}carstop;

carstop*creat()

carstop*S;

S=(Stack*)malloc(sizeof(Stack));

if(S!

{

S->

returnS;

carstop*push(carstop*s,intx)

s->

top]=x;

returns;

intpop(carstop*s)

inttemp;

chart;

top!

=-1)

if(temp>

9)

temp=(65-10)+temp;

t=(char)temp;

cout<

t<

temp<

returntemp;

carstop*stack1(carstop*s,intx)

inttemp1=1;

inttemp2;

while(temp1!

=0)

temp1=x/2;

temp2=x%2;

x=temp1;

s=push(s,temp2);

Stack*stack2(Stack*s,intx)

temp1=x/8;

temp2=x%8;

carstop*stack3(Stack*s,intx)

temp1=x/16;

temp2=x%16;

inta,b;

carstop*P;

P=creat();

请输入数字"

cin>

a;

P=stack3(P,a);

pop(P);

P=stack1(P,a);

P=stack2(P,a);

第四题:

string.h>

#defineN20

typedefstructstack

chardata[N];

};

stack*creat()

stack*S;

S=(stack*)malloc(sizeof(stack));

S->

returnS;

stack*push(stack*S,chara)

data[S->

top]=a;

stack*pop(stack*S)

chara;

a=S->

chars[N];

S=creat();

请输入内容:

s;

for(inti=0;

s[i]!

='

\0'

i++)

push(S,s[i]);

for(i;

i--)

if(s[i]==S->

top])

pop(S);

if(S->

top==-1)

是回文!

不是回文!

第五题:

(参考别人的)

#defineStackInitSize50

typedefintStackElementType;

StackElementTypea[StackInitSize];

StackElementTypeb[StackInitSize];

}SeqStack;

SeqStack*InitStack()

SeqStack*s;

s=(SeqStack*)malloc(sizeof(SeqStack));

}else{

printf("

没有足够的内存空间,申请失败,程序运行终止!

\n"

voidDestoryStack(SeqStack*s)

free(s);

printf("

栈已销毁!

voidPush(SeqStack*s,StackElementTypex,StackElementTypey)

top==StackInitSize)

栈满!

程序运行终止!

else{

a[s->

b[s->

top]=y;

StackElementTypePop(SeqStack*s)

StackElementTypetemp1,temp2;

temp1=s->

temp2=s->

return0;

StackElementTypeGetTop(SeqStack*s,StackElementType*elem1,StackElementType*elem2)

*elem1=s->

*elem2=s->

intmain()

intx,y,n,k2,k3,a;

intsum=0;

intb=0;

intk1[50];

请输入需要拆分的数:

n;

拆分的结果为:

s=InitStack();

Push(s,1,n);

GetTop(s,&

x,&

y);

if(x<

y/2.0)

Push(s,x,y-x);

GetTop(s,&

k1[i],&

k2);

b++;

n<

="

for(intj=0;

j<

=i;

j++)

cout<

k1[j]<

+"

k2<

elseif(x==y/2.0)

{

Pop(s);

for(;

GetTop(s,&

a,&

k3);

if(k3<

=n/2)

for(intt=0;

=b-1;

t++)

sum+=k1[t];

s->

top]=sum;

cout<

sum<

k3<

Pop(s);

b--;

sum=0;

}elsebreak;

}break;

////第五题代码参考其他同学的,已理解。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1