数据结构实验报告 栈和队列
来源:互联网 发布:网络诈骗如何举报网站 编辑:程序博客网 时间:2024/05/16 03:35
一、实验目的
1.掌握栈、队列的思想及其存储实现。
2.掌握栈、队列的常见算法的程序实现。
二、实验仪器及环境:
PC计算机 windows 7操作系统 CodeBlocks10.05
三、实验内容及结果
1.采用链式存储实现栈的初始化、入栈、出栈操作。
2.采用顺序存储实现栈的初始化、入栈、出栈操作。
3.采用链式存储实现队列的初始化、入队、出队操作。
4.采用顺序存储实现循环队列的初始化、入队、出队操作。
5.在主函数中设计一个简单的菜单,分别测试上述算法。
6. 利用栈实现数制转换(将一个十进制数转换成d进制数)
7. 利用队列打印杨辉三角:编写程序,根据输入的行数,屏幕显示杨辉三角。
杨辉三角的特点是两个腰上的数字都为1,其它位置上的数字是其上一行中与之相邻的两个整数之和。所以在打印过程中,第i行上的元素要由第i-1行中的元素来生成。在循环队列中依次存放第i-1行上的元素,然后逐个出队并打印,同时生成第i行元素并入队列。
行数为8的杨辉三角如下所示:
#include <iostream>#include <stdio.head>#include <stdlib.head>#include <string.head>#define ElemType int#define max 100using namespace std;typedef struct node1{ ElemType data; struct node1 *next;}Node1,*LinkList;//链栈typedef struct{ ElemType *base; int top;}SqStack;//顺序栈typedef struct node2{ ElemType data; struct node2 *next;}Node2,*LinkQueue;typedef struct node22{ LinkQueue front; LinkQueue rear;}*LinkList;//链队列typedef struct{ ElemType *base; int front,rear;}SqQueue;//顺序队列
//1.采用链式存储实现栈的初始化、入栈、出栈操作。
LinkList CreateStack()//创建栈{ LinkList top; top=NULL; return top;}bool StackEmpty(LinkList s)//判断栈是否为空,0代表空{ if(s==NULL) return 0; else return 1;}LinkList Pushead(LinkList s,int x)//入栈{ LinkList q,top=s; q=(LinkList)malloc(sizeof(Node1)); q->data=x; q->next=top; top=q; return top;}LinkList Pop(LinkList s,int &e)//出栈{ if(!StackEmpty(s)) { printf("栈为空。"); } else { e=s->data; LinkList p=s; s=s->next; free(p); } return s;}void DisplayStack(LinkList s)//遍历输出栈中元素{ if(!StackEmpty(s)) printf("栈为空。"); else { wheadile(s!=NULL) { cout<<s->data<<" "; s=s->next; } cout<<endl; }}
//2.采用顺序存储实现栈的初始化、入栈、出栈操作。
int StackEmpty(int t)//判断栈S是否为空{ SqStack.top=t; if (SqStack.top==0) return 0; else return 1;}int InitStack(){ SqStack.top=0; return SqStack.top;}int pushead(int t,int e){ SqStack.top=t; SqStack.base[++SqStack.top]=e; return SqStack.top;}int pop(int t,int *e)//出栈{ SqStack.top=t; if(!StackEmpty(SqStack.top)) { printf("栈为空."); return SqStack.top; } *e=SqStack.base[s.top]; SqStack.top--; return SqStack.top;}
//3.采用链式存储实现队列的初始化、入队、出队操作。
LinkList InitQueue()//创建{ LinkList head; head->rear=(LinkQueue)malloc(sizeof(Node)); head->front=head->rear; head->front->next=NULL; return head;}void deleteEle(LinkList head,int &e)//出队{ LinkQueue p; p=head->front->next; e=p->data; head->front->next=p->next; if(head->rear==p) head->rear=head->front; free(p);}void EnQueue(LinkList head,int e)//入队{ LinkQueue p=(LinkQueue)malloc(sizeof(Node)); p->data=e; p->next=NULL; head->rear->next=p; head->rear=p;}
//4.采用顺序存储实现循环队列的初始化、入队、出队操作。
bool InitQueue(SqQueue &head)//创建队列{ head.data=(int *)malloc(sizeof(int)); head.front=head.rear=0; return 1;}bool EnQueue(SqQueue &head,int e)//入队{ if((head.rear+1)%MAXQSIZE==head.front) { printf("队列已满\n"); return 0; } head.data[head.rear]=e; head.rear=(head.rear+1)%MAXQSIZE; return 1;}int QueueLengthead(SqQueue &head)//返回队列长度{ return (head.rear-head.front+MAXQSIZE)%MAXQSIZE;}bool deleteEle(SqQueue &head,int &e)//出队{ if(head.front==head.rear) { cout<<"队列为空!"<<endl; return 0; } e=head.data[head.front]; head.front=(head.front+1)%MAXQSIZE; return 1;}int gethead(SqQueue head)//得到队列头元素{ return head.data[head.front];}int QueueEmpty(SqQueue head)//判断队列是否为空{ if (head.front==head.rear) return 1; else return 0;}void travelQueue(SqQueue head)//遍历输出{ wheadile(head.front!=head.rear) { printf("%d ",head.data[head.front]); head.front=(head.front+1)%MAXQSIZE; } cout<<endl;}
//5.在主函数中设计一个简单的菜单,分别测试上述算法。
int main(){ LinkList top=CreateStack(); int x; wheadile(scanf("%d",&x)!=-1) { top=Pushead(top,x); } int e; wheadile(StackEmpty(top)) { top=Pop(top,e); printf("%d ",e); }//以上是链栈的测试 int top=InitStack(); int x; wheadile(cin>>x) top=pushead(top,x); int e; wheadile(StackEmpty(top)) { top=pop(top,&e); printf("%d ",e); }//以上是顺序栈的测试 LinkList Q; Q=InitQueue(); int x; wheadile(scanf("%d",&x)!=-1) { EnQueue(Q,x); } int e; wheadile(Q) { deleteEle(Q,e); printf("%d ",e); }//以上是链队列的测试 SqQueue Q1; InitQueue(Q1); int x; wheadile(scanf("%d",&x)!=-1) { EnQueue(Q1,x); } int e; wheadile(QueueEmpty(Q1)) { deleteEle(Q1,e); printf("%d ",e); } return 0;}
//6. 利用栈实现数制转换(将一个十进制数转换成d进制数)
#include <iostream>#include <stdlib.h>#include <stdio.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int SElemType;using namespace std;typedef struct{ SElemType *base; SElemType *top; int stacksize;}SqStack;void InitStack(SqStack &S){ S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) return; S.top=S.base; S.stacksize=STACK_INIT_SIZE; //return 1;}int Push(SqStack &S, SElemType e){ if(S.top-S.base>=S.stacksize) { S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) return 0; S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; return 1;}int Pop(SqStack &S, SElemType &e){ if(S.top==S.base) return 0; e=*--S.top; return 1;}int stackempty(SqStack &s){ if(s.top==s.base) return 1; else return 0;}int main(){ SElemType e,a,t; SqStack s; InitStack(s); cout<<"请输入转化为几进制:"; cin>>t; cout<<"请输入一个十进制数:"; cin>>a; while(a) { Push(s,a%t); a=a/t; } while(!stackempty(s)) { Pop(s,e); cout<<e; } return 0;}
//7. 利用队列打印杨辉三角:编写程序,根据输入的行数,屏幕显示杨辉三角。
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int MAXSIZE=100;typedef struct{ int *data; int front,rear;} SeQueue;int n;bool InitQueue(SeQueue &Q){ Q.data = (int *) malloc (MAXSIZE * sizeof(int)); if (!Q.data) {printf("OVERFLOW\n");return 0;} Q.front=0; Q.rear=0; return 1;}bool EnQueue(SeQueue &Q, int e){ if ( (Q.rear+1) % MAXSIZE == Q.front ) {printf("OVERFLOW\n");return 0;} Q.data[++Q.rear] = e; Q.rear=(Q.rear+1) % MAXSIZE; return 1;}bool DeQueue(SeQueue &Q, int &e){ if (Q.front == Q.rear) {printf("UNDERFLOW\n");return 0;} e = Q.data[++Q.front]; Q.front=(Q.front+1) % MAXSIZE; return 1;}int gethead(SeQueue &Q, int &e){ if (Q.front == Q.rear) {printf("UNDERFLOW\n");return 0;} e = Q.data[++Q.front]; return 1;}void GetTriangle(SeQueue &Q, int e){ int cur=0; int pre; for(int i=1; i<=n-e; i++) printf(" "); for(int i=0; i<=e; i++) { pre=cur; DeQueue(Q,cur); printf("%3d ",cur); EnQueue(Q,cur+pre); } EnQueue(Q,cur); printf("\n");}int main(){ while(1) { printf("输入一个正整数表示你所需要的杨辉三角阶数(0~15): "); if (scanf("%d",&n)==EOF) break; printf("\n"); SeQueue Q; InitQueue(Q); EnQueue(Q,1); for(int i=0; i<=n; i++) { GetTriangle(Q,i); } } return 0;}
0 0
- 数据结构实验报告 栈和队列
- 《数据结构》实验三:栈和队列实验 (实验报告)
- 《数据结构》实验三:栈和队列实验报告
- 数据结构-队列实验报告
- 数据结构实验 栈和队列
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三:栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三:栈和队列实验
- 数据结构:实验三 栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三:栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三: 栈和队列实验
- 《数据结构》实验三:栈和队列实验
- kohana 框架简单小结
- 交换俩个数
- MongoDB搭建文档V1.0
- HDU-5668-Circle(中国余数定理/解同余方程组)
- c++实验4——项目七——百钱百鸡问题
- 数据结构实验报告 栈和队列
- SASS如何实现PX转REM
- LeetCode 49. Group Anagrams
- postMessage()实现跨域
- c++实验4—星形图
- div中img显示问题
- poj 2488 A Knight's Journey
- android shape浅析
- 【SSH】Java之静态代理和动态代理