北理工数据结构作业2Word格式.docx
- 文档编号:19512385
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:11
- 大小:17.46KB
北理工数据结构作业2Word格式.docx
《北理工数据结构作业2Word格式.docx》由会员分享,可在线阅读,更多相关《北理工数据结构作业2Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
(1)Ststusalgo1(StackS)
{intI,n,A[255];
n=0;
while(!
{n++;
Pop(S,A[n]);
for(i=1;
i<
=n;
i++)
Push(S,A[n]);
实现栈中元素的逆置
(2)Statusalgo2(StackS,inte)
{StackT;
intd;
InitStack(T);
{Pop(S,d);
if(d!
=e)Push(T,d);
StackEmpty(T))
{Pop(T,d);
Push(S,d);
通过栈T的辅助删除栈S中所有值为e的元素
3、设有4个元素1、2、3、4依次进栈,而出栈操作可随时进行(进出栈可任意交错进行,但要保证进栈次序不破坏1、2、3、4的相对次序),请写出所有可能的出栈次序。
共14种情况,顺序如下:
1234,1243,1324,1342,1432,2134,2143,2314,2341,2431,3421,3241,3214,4321。
4、写出下列程序段的输出结果(队列中的元素类型QelemType为char)。
{QueueQ;
InitQueue(Q);
charx=’e’,y=’c’;
EnQueue(Q,’h’);
EnQueue(Q,’r’);
EnQueue(Q,y);
DeQueue(Q,x);
EnQueue(Q,x);
EnQueue(Q,’a’);
QueueEmpty(Q))
{DeQueue(Q,y);
printf(y);
cha
5、简述下列算法的功能(栈和队列的元素类型均为int)。
voidalgo3(Queue&
Q)
InitStack(S);
QueueEmpt(Q))
{DeQueue(Q,d);
Push(S,d);
{Pop(S,d);
EnQueue(Q,d);
利用栈S将队列Q中的元素进行逆置。
6、为了充分利用空间,将两个栈共同存储在长度为n的一维数组中,共享数组空间。
设计两个栈共享一维数组的存储表示方式,画出示意图。
设计两个栈Stack1和Stack2共享数组空间,Stack1的栈底放在数组的首端,Stack2的栈底放在数组的尾端,分别向两个栈中存储相应的元素,两个栈的栈顶分别向数组中间扩展。
当总的存储空间不大于数组长度时,数组空间将得到最大利用。
当两个栈占满整个数组空间时,这时两个栈共享一个长度为n的数组空间,再向栈中放元素时会发生上溢。
0(Stack1底)
1
2
……
Stack1顶
Stack2顶
n-3
n-2
n-1(Stack2底)
实验二
1、简单计算器。
请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。
要求:
1从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。
2输入表达式中的数值均为大于等于零的整数。
中间的计算过程如果出现小数也只取整。
例如,输入:
4+2*5=输出:
14
输入:
(4+2)*(2-10)=输出:
-48
程序如下:
#include<
stdio.h>
stdlib.h>
malloc.h>
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineSTACK_INIT_SIZE100//存储空间初始分配量
#defineSTACKINCREMENT10//存储空间分配增量
typedefstruct{//定义运算符栈数据类型
char*base;
char*top;
intstacksize;
}SqStack1;
typedefstruct{//定义操作数栈数据类型
int*base;
int*top;
}SqStack2;
intInitStack1(SqStack1&
S){//构造一个空的运算符栈
S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}//InitStack1
intInitStack2(SqStack2&
S){//构造一个空的操作数栈
S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
}//InitStack2
charGetTop1(SqStack1S){//若栈不空,则用char型元素e返回S的栈顶元素,并返回OK;
否则返回ERROR
chare;
if(S.top==S.base)returnERROR;
e=*(S.top-1);
returne;
}//GetTop1
intGetTop2(SqStack2S){//若栈不空,则用int型元素e返回S的栈顶元素,并返回OK;
inte;
}//GetTop2
intPush1(SqStack1&
S,chare){//插入char型元素e为新的栈顶元素
if(S.top-S.base>
=S.stacksize){
S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
*S.top++=e;
}//Push1
intPush2(SqStack2&
S,inte){//插入int型元素e为新的栈顶元素
S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
}//Push2
intPop1(SqStack1&
S,char&
e){//若栈不空,则删除S的栈顶元素,用char型元素e返回其值,并返回OK;
e=*--S.top;
}//Pop1
intPop2(SqStack2&
S,int&
e){//若栈不空,则删除S的栈顶元素,用int型元素e返回其值,并返回OK;
}//Pop2
charPrecede(chara,charb){//比较两个相继出现的运算符a和b间的优先级关系
switch(a){
case'
+'
:
switch(b){
case'
return'
>
'
;
break;
-'
*'
<
/'
('
)'
='
^'
}
case'
#'
}//Precede
intpow(inta,intb){//求幂函数
intx;
for(x=1;
b>
0;
b--)x=x*a;
returnx;
}//pow
intOperate(inta,chartheta,intb){//操作数a和b进行运算
switch(theta){
return(a+b);
return(a-b);
return(a*b);
return(a/b);
return(pow(a,b));
}//Operate
intIn(charc){//判断字符c是否为运算符
if(c!
&
c!
)returnERROR;
elsereturnOK;
}//In
intEvaluateExpression(){
intx,a,b;
charc,theta;
SqStack1OPTR;
SqStack2OPND;
InitStack1(OPTR);
InitStack2(OPND);
Push1(OPTR,'
);
c=getchar();
while(c!
\n'
){
x=0;
if(!
In(c))//c是操作数
{
while(!
In(c))
{
x=x*10+c-48;
c=getchar();
}
Push2(OPND,x);
else//c是算符
switch(Precede(GetTop1(OPTR),c))
case'
Push1(OPTR,c);
c=getchar();
//栈顶元素优先权低
Pop1(OPTR,c);
//脱括号并接受下一个字符
//退栈并将运算结果入栈
Pop1(OPTR,theta);
Pop2(OPND,b);
Pop2(OPND,a);
Push2(OPND,Operate(a,theta,b));
break;
}//switch
}//while
returnGetTop2(OPND);
}//EvaluateExpression
main()
{printf("
%d"
EvaluateExpression());
//注:
本程序存为.cpp方可运行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北理工 数据结构 作业