数据结构实验二——栈和队列

来源:互联网 发布:java jframe重绘 编辑:程序博客网 时间:2024/05/23 00:00
1.1.编写一个程序,实现顺序栈的各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1)初始化栈s;
(2)判断栈s是否为空;
(3)依次进栈元素-1,2,10,-3,5;
(4)判断栈s是否为空;
(5)输出栈长度;
(6)输出从栈顶到栈底的元素;
(7)输出出栈序列;

(8)判断栈s是否为空。

我的代码如下:

#include "c1.h"#define MaxSize 100typedef int ElemType;typedef struct{ElemType data[MaxSize];int top;} Stack;Status InitStack(Stack *&s)//初始化栈{s = (Stack *)malloc(sizeof(Stack));s->top = -1;return OK;}Status LengthStack(Stack *s){return(s->top);}Status StackEmpty(Stack *s)//判断空栈{if (s->top == -1)return 1;else return 0;}Status Push(Stack *&s, ElemType e)//入栈{if (s->top == MaxSize - 1)return ERROR;s->top++;s->data[s->top] = e;return OK;}Status StackTraverse(Stack s, Status(*visit)(ElemType))//遍历栈{while (s.top != -1){visit(s.data[s.top]);s.top--;}return OK;}Status Visit(ElemType e){   //访问元素printf("%d     ", e);return OK;}Status Pop(Stack *&s, ElemType &e)//出栈{if (s->top == -1)return ERROR;e = s->data[s->top];s->top--;return OK;}void main(){Stack *s;int r, i;int e;InitStack(s);printf("初始化成功!\n\n");r = StackEmpty(s);if (r == 1)printf("此顺序栈为空栈\n\n");elseprintf("此顺序栈不为空栈\n\n");Push(s, -1);Push(s, 2);Push(s, 10);Push(s, -3);Push(s, 5);printf("-1,2,10,-3,5顺序进栈成功!\n\n");r = StackEmpty(s);if (r == 1)printf("此顺序栈为空栈\n\n");elseprintf("此顺序栈不为空栈\n\n");r = LengthStack(s);r++;printf("此顺序栈的长度为%d\n\n", r);printf("从栈顶到栈底的元素顺序为:");StackTraverse(*s,Visit);printf("\n\n");printf("出栈顺序为:");for (i = 0; i <= r; i++){Pop(s, e);printf("%d  ", e);}printf("\n\n");r = StackEmpty(s);if (r == 1)printf("此顺序栈为空栈\n\n");elseprintf("此顺序栈不为空栈\n\n");}


2.编写一个程序,实现链栈的各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1)初始化栈s;
(2)判断栈s是否为空;
(3)依次进栈元素10,-2,10,-3,15,12;
(4)判断栈s是否为空;
(5)输出栈长度;
(6)输出从栈顶到栈底的元素;
(7)输出出栈序列;
(8)判断栈s是否为空。


我的代码如下:

#include "c1.h"typedef int ElemType;typedef struct linknode{ElemType data;struct linknode *next;} LiStack;Status InitStack(LiStack *&s)//初始化栈s{s = (LiStack *)malloc(sizeof(LiStack));s->next = NULL;return OK;}Status StackEmpty(LiStack *s)//判断栈是否为空{if (s->next == NULL)return 1;else return 0;}Status Stacklength(LiStack *s)//计算栈长{int count = 0;while (s->next != NULL){count++;s = s->next;}return count;}Status StackTraverse(LiStack *s, Status(*visit)(ElemType))//遍历栈{LiStack *p = s->next;while (p){visit(p->data);p = p->next;}return OK;}Status Visit(ElemType e){   //访问元素printf("%d  ", e);return OK;}Status Push(LiStack *&s, ElemType e)  //入栈{LiStack *p;p = (LiStack *)malloc(sizeof(LiStack));p->data = e;p->next = s->next;s->next = p;return OK;}Status Pop(LiStack *&s, ElemType &e)//出栈{LiStack *p;if (s->next == NULL)return ERROR;p = s->next;e = p->data;s->next = p->next;free(p);return OK;}void main(){ElemType e;LiStack *s;int r;InitStack(s);printf("初始化成功!\n\n");r = StackEmpty(s);if (r == 1)printf("栈为空栈\n\n");else printf("栈不为空栈\n\n");printf("依次进栈元素10,-2,10,-3,15,12\n\n");Push(s, 10);Push(s, -2);Push(s, 10);Push(s, -3);Push(s, 15);Push(s, 12);r = StackEmpty(s);if (r == 1)printf("栈为空栈\n\n");else printf("栈不为空栈\n\n");r = Stacklength(s);printf("栈的长度为%d\n\n",r);printf("从栈顶到栈底的顺序为:");StackTraverse(s, Visit);printf("\n\n");printf("出栈序列:");while (!StackEmpty(s)){Pop(s, e);printf("%d ", e);}printf("\n\n");r = StackEmpty(s);if (r == 1)printf("栈为空栈\n\n");else printf("栈不为空栈\n\n");}


3.编写一个程序,实现循环队列的各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1)初始化队列q;
(2)判断队列q是否为空;
(3)依次进队列元素-1,2,10;
(4)出队一个元素,并输出该元素;
(5)输出队列的长度(元素个数);
(6)依次进队元素-3,12,10;
(7)输出出队序列;
(8)判断队列q是否为空。


我的代码如下:

#include "c1.h"#define MAXQSIZE 100typedef int QElemType;typedef struct{QElemType *base;int front;int rear;}SqQueue;Status InitQueue(SqQueue &Q){     //初始化队列Q.base = (QElemType *)malloc(MAXQSIZE *sizeof(QElemType));if (!Q.base)exit(OVERFLOW);Q.front = Q.rear = 0;return OK;}int QueueLength(SqQueue Q){    //求队列长度return(Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;}Status EnQueue(SqQueue &Q, QElemType e){     //入队if ((Q.rear + 1) % MAXQSIZE == Q.front){return ERROR;}Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAXQSIZE;return OK;}Status Dequeue(SqQueue &Q, QElemType &e){     //出队if (Q.front == Q.rear){return ERROR;}e = Q.base[Q.front];Q.front = (Q.front + 1) % MAXQSIZE;return OK;}Status IsEmpty(SqQueue &Q){         //判断是否为空队列if (Q.front==Q.rear)return 1;else return 0;}void main(){SqQueue s;QElemType e;int r;InitQueue(s);printf("初始化成功!\n\n");r = IsEmpty(s);if (r == 1)printf("这是空队列\n\n");else printf("这不是空队列\n\n");EnQueue(s, -1);EnQueue(s, 2);EnQueue(s, 10);printf("-1,2,10进队成功!\n\n");Dequeue(s, e);printf("出队一个元素并输出该元素为:%d", e);printf("\n\n");r=QueueLength(s);printf("队列的长度为:%d\n\n", r);EnQueue(s, -3);EnQueue(s, 12);EnQueue(s, 10);printf("再次入队-3,12,10成功!\n\n");printf("出队序列为:");while (s.front!=s.rear){Dequeue(s, e);printf("%d  ", e);}printf("\n\n");r = IsEmpty(s);if (r == 1)printf("这是空队列\n\n");else printf("这不是空队列\n\n");}

4.编写一个程序,实现链队列的各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1)初始化队列q;
(2)判断队列q是否为空;
(3)依次进队列元素1,12,-10;
(4)出队一个元素,并输出该元素;
(5)输出队列的长度(元素个数);
(6)依次进队元素13,-12,10;
(7)输出队列长度;
(8)输出出队序列。

我的代码如下:

#include "c1.h"#define N 50typedef int Elemtype;typedef struct qnode{Elemtype data;struct qnode * next;}QNode;typedef struct{QNode *front;QNode *rear;}ListQueue;Status InitQueue(ListQueue *&q){q=(ListQueue * )malloc(sizeof(ListQueue));q->front=q->rear=NULL;return OK;}Status QueueEmpty(ListQueue *q){return(q->rear==NULL);return OK;}Status enQueue(ListQueue * &q,Elemtype e){QNode *p;p=(QNode *)malloc(sizeof(QNode));p->data=e;p->next=NULL;if(q->rear==NULL)q->front=q->rear=p;else{q->rear->next=p;q->rear=p;}return OK;}Status deQueue(ListQueue *&q,Elemtype &e){QNode *t;if(q->rear==NULL)return ERROR;t=q->front;if(q->front==q->rear)q->front=q->rear=NULL;elseq->front=q->front->next;e=t->data;free(t);return OK;}Status Queuelength(ListQueue *q){int count=0;QNode *p;p=q->front;while(p!=q->rear){count++;p=p->next;}count++;return count;}void main(){int x;int e;ListQueue *q;QNode *p;InitQueue(q);printf("初始化成功\n\n");x=QueueEmpty(q);if(x==1)printf("此队为空队\n\n");elseprintf("此队不为空队\n\n");printf("依次入队元素1,12,-10\n\n");enQueue(q,1);enQueue(q,12);enQueue(q,-10);deQueue(q,e);printf("出队一个元素,并输入该元素为:%2d\n\n",e);printf("链队的元素个数为%d\n\n",x=Queuelength(q));printf("再次入队列13,-12,10\n\n");enQueue(q, 13);enQueue(q, -12);enQueue(q, 10);printf("链队的元素个数为%d\n\n出队序列为:", x = Queuelength(q));while (!QueueEmpty(q)){deQueue(q,e);printf("%d  ",e);}printf("\n\n");}

5.借助栈实现数制转换。要求将非负十进制整数N转换为二进制输出。

我的代码如下:

#include "c1.h"#define MaxSize 100typedef int ElemType;typedef struct{ElemType  data[MaxSize];int top;}Stack;Status InitStack(Stack *S)  //初始化栈{  S->top=-1;return OK; } Status Push(Stack *S,ElemType x){ if(S->top==MaxSize-1)    //入栈{ printf("\n Stack is full!"); return 0; }S->top++;S->data[S->top]=x;return 1; }Status Empty(Stack *S)  //清空栈 { return (S->top==-1); }Status Pop(Stack *S,ElemType *x)    //出栈{ if(Empty(S)){   printf("\n Stack is free!"); return 0;}*x=S->data[S->top];S->top--;return 1;  }Status Conversion(int N){    //进制转换int e;if(N<0)return ERROR;Stack *S=(Stack*)malloc(sizeof(Stack));InitStack(S); while(N){Push(S,N%2);    //除二取余法N=N/2; }while(!Empty(S)){Pop(S,&e);printf("%d",e); }return OK;}int main(){ int n=0,r;printf("请输入待转换的值n:\n");while(n!=-1){scanf("%d",&n);if(n=-1)return 0;printf("转换后的二进制值为:\n");r=Conversion(n);if(r==ERROR)printf("负数出错!\n");printf("\n\n");printf("请输入待转换的值n:\n");}return 0;}}

6.借助队列实现杨辉三角的计算。要求输出输出杨辉三角的前N行。
提示:杨辉三角的计算是有规律可循的,即每一行的第一个和最后一个数都是1,从第3行开始的其余的数假设为该行的第i个数,则其值为上一行中第i-1个数和第i个数之和。由此可见,每一行的数值是由上一行的数值求得的。因此,计算某一行数值得方法是:对其上一行数值,从左至右两两相加。为了按照次序存储结果,可以利用队列先进先出的特性,将上一行数值用队列存储,每得到一个和值,就将相加的两个数中的前一个数出队,并将和值入队。

我的代码如下:

#include "c1.h"#define maxsize 100typedef int Qelemtype;typedef struct{Qelemtype *base;int f;int r;}Squeue;Status InitQueue(Squeue & Q)//初始化队列{Q.base=(Qelemtype*)malloc(maxsize*sizeof(Qelemtype));Q.base=new(Qelemtype);if(!Q.base)return ERROR;Q.f=Q.r=0;return OK;}Status EnQueue(Squeue & Q,Qelemtype e)//入队{if((Q.r+1)%maxsize==Q.f){printf("队列已满\n");    return ERROR;}Q.base[Q.r]=e;Q.r=(Q.r+1)%maxsize;return OK;}Status DeQueue(Squeue & Q,Qelemtype &e)//出队{if(Q.f==Q.r){printf("队列已空\n");return ERROR;}e=Q.base[Q.f];Q.f=(Q.f+1)%maxsize;return OK;}void YangHui(int n)//求取杨辉三角{Squeue q;                        int i=1,j,s=0,m,t,u;        InitQueue(q);EnQueue(q,1);//入队第一个元素for(i=0;i<n;i++)//行计数{for(m=i;m<n;m++)printf("   ");EnQueue(q,0);//插入0表示本行结束for(j=1;j<=i+2;j++)//处理第i行的i+2个系数{DeQueue(q,t);//读取一个系数u=s+t; EnQueue(q,u);//计算下一行系数,并进队列s=t;if(j!=i+2)//第i+2个位置应该为换行(例如第一行i=0则第i+2=2个位置应该为换行)printf("%6d",s);//输出一个系数}printf("\n\n");}}void main()//主函数{int n;printf("输入要生成的杨辉三角阶数n=");scanf("%d",&n);printf("\n所求杨辉三角为:\n");YangHui (n);printf("\n");}


0 0