1、栈、队列的算法是后续实验的基础(广义表、树、图、查找、排序等)。4判断“回文”问题(实验类型:所谓回文,是指从前向后顺读和从后向前倒读都一样的字符串。例如,did; pop; I was able 与 elba saw I 等等。编写程序,利用栈结构判断一个字符串是否是“回文”。从左向右遇到的字符,若和栈顶元素比较,若不相等,字符入栈,若相等,出栈。如此继续,若栈空,字符串是“回文”,否则不是。5用递归和非递归两种方法实现自然数的拆分(实验类型:任何大于 1 的自然数 n,总可以拆分成若干大于等于1 的自然数之和。 例: n=4 4=1+3 4=1+1+2 4=1+1+1+1 4=2+2 采用
2、递归和非递归两种方法实现利用交换率得出的拆分看作相同的拆分。递归算法:用数组a,ak中存储已完成的一种拆分ak能否再拆分取决于ak/2是否大于等于ak-1;递归过程有两个参数:n表示要拆分数值的大小;k表示n存储在数组元素ak中。非递归算法:(1)栈为两个数组a,b,ax,bx表示两个栈的栈顶元素;初始化:a1=1,b1=n,i=1, ax=ai,bx=bi(2)若i1 or axbx,重复若axbx/2,进栈并取栈顶元素,返回(2) i=i+1;ai=ax,bi=bx-ax,bx=bi若ax=bx,则数出拆分,退栈兵修改栈顶元素,返回(2) i=i-1;ai=ai+1,ax=ai,bx=bi
3、其余情况,bx/2axbx,修改栈顶元素,返回(2) ai=ai+1,ax=ai实验内容(应包括实验题目、实验要求、实验任务等)附录(可包括源程序清单或其它说明)实验源程序代码如下:第一题:#include stdlib.h#include#define StackSize 100typedef int StackType;typedef struct StackType dataStackSize; int top;Seq_stack;Seq_stack *Creatstack() Seq_stack *s; s=(Seq_stack *)malloc(sizeof(Seq_stack);
4、if(s!=NULL) s-top=-1; return s; else couttop=-1)此栈为空栈!此栈不是空栈!*/void Push(Seq_stack *s,StackType m) /入栈操作top=StackSize-1)此栈已满终止程序!top+;datas-top=m;StackType Pop(Seq_stack *s) StackType temp;程序终止 temp=s-top;top-; return temp;void conver(int N,int i) /数制转换 StackType m; s=Creatstack(); while(N) Push(s,N
5、%i);/余数存入栈 N=N/i; /商作为被除数继续循环 while(s-top-1) m=Pop(s);m; coutN;请输入将要转换成 几 进制数i;您将要转换成 idata; t=t-next; free(temp); /释放删除节点所占内存空间 return t;StackType Get_top(Stack_node *t) /读取栈中数据此栈为空,无法读取! return 0; return t-int sub(StackType x) switch(x) case +:- return 1;* return 2;/ return 3;% return 4;( return 5
6、;) return 6;# return 7; StackType x1,x2,i,j,op,temp; char ch; 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(priorityij=3) OPTR=Pop(OPTR,&op); OPND=Pop(OPN
7、D,&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(priorityij=1) /栈内运算符优先级小于栈外运算符优先级 OPTR=Push(OPTR,ch); if(priorityij=2)temp); OPND=Push(OPND,ch-48); /将数字字符转换为数字压入栈中 ch=getchar();表达式的值为:G
8、et_top(OPND) return S;carstop* push(carstop* s,int x) s-top=x; return s;int pop(carstop* s) int temp; char t;top!=-1) if(temp9) temp=(65-10)+temp; t=(char)temp; coutttempa; P=stack3(P,a); pop(P); P=stack1(P,a); P=stack2(P,a);第四题:string.h#define N 20typedef struct stack char dataN;stack* creat() stac
9、k* S; S=(stack*)malloc(sizeof(stack); S- return S;stack* push(stack* S,char a)dataS-top=a;stack* pop(stack* S) char a; a=S- char sN; S=creat();请输入内容:s; for(int i=0;si!=0i+) push(S,si); for(i;i-) if(si=S-top) pop(S);if(S-top=-1) 是回文!不是回文!第五题:(参考别人的)#define StackInitSize 50typedef int StackElementType
10、; StackElementType aStackInitSize; StackElementType bStackInitSize;SeqStack;SeqStack*InitStack() SeqStack*s; s=(SeqStack*)malloc(sizeof(SeqStack); else printf(没有足够的内存空间,申请失败,程序运行终止!nvoid DestoryStack(SeqStack*s) free(s); printf(栈已销毁!void Push(SeqStack*s,StackElementType x,StackElementType y)top=Stac
11、kInitSize)栈满!程序运行终止! elseas-bs-top=y;StackElementType Pop(SeqStack*s) StackElementType temp1,temp2; temp1=s- temp2=s- return 0;StackElementType GetTop(SeqStack*s,StackElementType*elem1,StackElementType*elem2) *elem1=s- *elem2=s-int main() int x,y,n,k2,k3,a; int sum=0; int b=0; int k150;请输入需要拆分的数:n;拆分的结果为: s=InitStack(); Push(s,1,n); GetTop(s,&x,&y); if(xy/2.0) Push(s,x,y-x); GetTop(s,&k1i,&k2); b+;n= for(int j=0;j=i;j+) coutk1j+k2 else if(x=y/2.0) Pop(s); for(; GetTop(s,&a,&k3); if(k3top=sum; coutsumk3 Pop(s); b-; sum=0; else break; break;/第五题代码参考其他同学的,已理解。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1