栈和队列的操作
实验内容:
- 编程实现顺序栈和链栈的基本操作:建栈,取栈顶元素,入栈,出栈;
- 编程实现循环队列和链队列的基本操作:建队列,取队头元素,入队,出队。
#include<iostream> #include<cstdlib> #include<cmath> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; #define MAXSIZE 100 #define OK 1 #define ERROR 0 typedef int ElemType; typedef int Status; typedef int SElemType; typedef int QElemType; typedef struct { SElemType *base; SElemType *top; int stacksize; } SqStack; //顺序栈的声明 typedef struct StackNode { ElemType data; struct StackNode *next; } StackNode,*LinkStack; //链栈的声明 typedef struct { QElemType *base; int front ; int rear; } SqQueue; //循环队列的声明 typedef struct QNode { QElemType data; struct QNode *next; } QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; } LinkQueue; //链队的声明 Status InitStack1(SqStack &S)//栈的初始化 { S.base=new SElemType[MAXSIZE]; if(!S.base) exit (OVERFLOW); S.top=S.base; S.stacksize=MAXSIZE; return OK; } Status Push1(SqStack &S,SElemType e)//进栈 { if(S.top-S.base==S.stacksize)return ERROR; *S.top++=e; return OK; } Status Pop1(SqStack &S,SElemType &e)//出栈 { if(S.top==S.base)return ERROR; e=*--S.top; cout<<e<<" "; return OK; } SElemType GetTop1(SqStack S)//取栈顶元素 { if(S.top!=S.base) { cout<<*(S.top-1)<<endl; return *(S.top-1); } } Status InitStack2(LinkStack &S)//链栈的初始化 { S=NULL; return OK; } Status Push2(LinkStack &S,SElemType e)//链栈的入栈 { LinkStack p; p=new StackNode; p->data=e; p->next=S; S=p; return OK; } Status Pop2(LinkStack &S,SElemType &e)//链栈的出栈 { LinkStack p; if(S==NULL)return ERROR; e=S->data; cout<<e<<" "; p=S; S=S->next; delete p; return OK; } SElemType GetTop2(LinkStack S)//链栈的取栈顶元素 { if(S!=NULL) cout<<S->data<<endl; return S->data; } Status InitQueue1(SqQueue &Q)//循环队列的初始化 { Q.base=new QElemType[MAXSIZE]; if(!Q.base)exit(OVERFLOW); Q.front=Q.rear=0; return OK; } int QueueLength(SqQueue Q)//求循环队列的长度 { return (Q.rear-Q.front+MAXSIZE)%MAXSIZE; } Status EnQueue1(SqQueue &Q,QElemType e)//循环队列的入队 { if((Q.rear+1)%MAXSIZE==Q.front) return ERROR; Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXSIZE ; return OK; } Status DeQueue1(SqQueue &Q,QElemType &e)//循环队列出队 { if(Q.front==Q.rear)return ERROR; e=Q.base[Q.front]; Q.front=(Q.front+1)%MAXSIZE; cout<<e<<" "; return OK; } SElemType GetHead1(SqQueue Q)//循环队列取队头元素 { if(Q.front!=Q.rear) cout<<Q.base[Q.front]; cout<<endl; return Q.base[Q.front]; } Status InitQueue2(LinkQueue &Q)//链队的初始化 { Q.front=Q.rear=new QNode; Q.front->next=NULL; return OK; } Status EnQueue2(LinkQueue &Q,QElemType e)//链队的入队 { QueuePtr p; p=new QNode; p->data=e; p->next=NULL; Q.rear->next=p; Q.rear=p; return OK; } Status DeQueue2(LinkQueue &Q,QElemType &e)//链队的出队 { QueuePtr p; if(Q.front==Q.rear)return ERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; delete p; cout<<e<<" "; return OK; } SElemType GetHead2(LinkQueue Q) { if(Q.front!=Q.rear) cout<<Q.front->next->data; cout<<endl; return Q.front->next->data; } int main() { SqStack S; int i,n,x,j,y,e,m,a,b,c,d; InitStack1(S); cout<<"请输入一个数表示顺序栈的长度"<<endl; cin>>n; cout<<"进栈"<<endl; for(i=0; i<n; i++)//让从0到n-1的数据进栈 { cin>>c; Push1(S,c); } cout<<"取顺序栈的栈顶元素"<<endl; GetTop1(S); cout<<"显示顺序栈中的数据元素,让其出栈"<<endl; for(j=0; j<n; j++) { Pop1(S,x); } cout<<endl; //顺序栈的进栈,出栈,取栈顶元素 cout<<endl; LinkStack S1; InitStack2(S1); cout<<"请输入一个数表示链栈的长度"<<endl; cin>>n; cout<<"进栈"<<endl; for(i=0; i<n; i++)//让从0到n-1的数据进栈 { cin>>d; Push2(S1,d); } cout<<"取链栈的栈顶元素"<<endl; GetTop2(S1); cout<<"显示链栈中的数据元素,让其出栈"<<endl; for(j=0; j<n; j++) { Pop2(S1,y); } cout<<endl; //链栈的进栈,出栈和取栈顶元素 cout<<endl; SqQueue Q; InitQueue1 (Q); cout << "1.入队" << endl; cout<<"请输入一个数表示循环队列长度"<<endl; cin>>n; for ( i = 0; i < n; i++) { cin >> e; EnQueue1(Q, e); } cout << "2.取队头元素" << endl; GetHead1(Q); cout << "3.出队" << endl; for ( i = 0; i < n; i++) { DeQueue1(Q,m); } cout<<endl; //循环队列的入队,取队头元素,出队 cout<<endl; LinkQueue Q1; InitQueue2 (Q1); cout << "A.入队" << endl; cout<<"请输入一个数表示链式队列长度"<<endl; cin>>n; for ( i = 0; i < n; i++) { cin >> b; EnQueue2(Q1, b); } cout << "B.取队头元素" << endl; GetHead2(Q1); cout << "C.出队" << endl; for ( i = 0; i < n; i++) { DeQueue2(Q1,a); } cout<<endl; //链队的入队,取队头元素,出队 return 0; }