实验性质:验证性实验
要求:
(1)编程实现栈的以下基本操作:建栈,取栈顶元素,入栈,出栈。
(2)编程实现队列的以下基本操作:建队列,取队头元素,入队,出队。
目的:
(1)掌握栈的顺序存储结构、链式存储结构及其基本操作;
(2)掌握队列的顺序存储结构、链式存储结构及其基本操作。
代码
#include <iostream>
#include <cstdlib>
using namespace std;
#define MAXSIZE 100
typedef int SElemType;
typedef int QElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
typedef struct
{
QElemType *base;
int front;
int rear;
}SqQueue;
void InitStack(SqStack &S); //顺序栈的初始化
void Push(SqStack &S,int v);//顺序栈的入栈
void Pop(SqStack &S); //删除栈顶元素
void GetTop(SqStack S); //取栈顶元素
void DisplayS(SqStack S); //显示顺序栈元素
void InitQueue(SqQueue &Q); //循环队列的初始化
void EnQueue(SqQueue &Q,int v); //循环队列的入队
void DeQueue(SqQueue &Q); //循环队列的出队
void GetHead(SqQueue Q); //取循环队列的队头
void DisplayQ(SqQueue Q); //显示循环队列元素
void Menu(); //文字菜单提示信息
int main()
{
SqStack S;
Menu();
InitStack(S);
SqQueue Q;
InitQueue(Q);
int v,i; //插入元素的数值和操作代码
cout<<"请输入操作代码:";
cin>>i;
while(true)
{
switch(i)
{
case 1:
cout<<"输入要插入的值:";
cin>>v;
Push(S,v);
break;
case 2:
Pop(S);
break;
case 3:
GetTop(S);
break;
case 4:
DisplayS(S);
break;
case 5:
cout<<"输入要插入的值:";
cin>>v;
EnQueue(Q,v);
break;
case 6:
DeQueue(Q);
break;
case 7:
GetHead(Q);
break;
case 8:
DisplayQ(Q);
break;
case 9:
system("cls");
Menu();
break;
default:
if(i<0)
return 0;
else
{
cout<<"输入的位置非法,请重新输入";
break;
}
}
cout<<"请输入操作代码:";
cin>>i;
}
return 0;
}
void InitStack(SqStack &S) //顺序栈的初始化
{
S.base=new SElemType[MAXSIZE];
if(!S.base)
cout<<"存储分配失败"<<endl;
else
{
S.top=S.base; //top初始化为base,空栈
S.stacksize=MAXSIZE;
}
}
void Push(SqStack &S,int v)//顺序栈的入栈
{
if(S.top-S.base==S.stacksize)
cout<<"当前栈已满"<<endl;
else
{
*S.top++=v;
cout<<"入栈成功"<<endl;
}
}
void Pop(SqStack &S) //删除栈顶元素
{
if(S.top==S.base)
cout<<"当前栈为空栈,无法出栈"<<endl;
else
{
--S.top;
cout<<"出栈成功"<<endl;
}
}
void GetTop(SqStack S) //取栈顶元素
{
if(S.top!=S.base)
cout<<"栈顶元素为:"<<*(S.top-1)<<endl;
else
cout<<"当前栈为空栈"<<endl;
}
void DisplayS(SqStack S) //显示顺序栈元素
{
if(S.top==S.base)
cout<<"当前栈为空栈"<<endl;
else
{
cout<<"栈中元素为";
while(S.top!=S.base)
cout<<*--S.top<<" ";
cout<<endl;
}
}
void InitQueue(SqQueue &Q) //循环队列的初始化
{
Q.base=new QElemType[MAXSIZE];
if(!Q.base)
cout<<"存储分配失败"<<endl;
else
Q.front=Q.rear=0;
}
void EnQueue(SqQueue &Q,int v) //循环队列的入队
{
if((Q.rear+1)%MAXSIZE==Q.front)
cout<<"循环队列已满,无法插入"<<endl;
else
{
Q.base[Q.rear]=v;
Q.rear=(Q.rear+1)%MAXSIZE;
cout<<"入队成功"<<endl;
}
}
void DeQueue(SqQueue &Q) //循环队列的出队
{
if(Q.front==Q.rear)
cout<<"循环队列为空,无法出队"<<endl;
else
{
Q.front=(Q.front+1)%MAXSIZE;
cout<<"出队成功"<<endl;
}
}
void GetHead(SqQueue Q) //取循环队列的队头
{
if(Q.front!=Q.rear)
cout<<"队头为:"<<Q.base[Q.front]<<endl;
}
void DisplayQ(SqQueue Q) //显示循环队列元素
{
if(Q.front!=Q.rear)
{
int i=0;
while(((Q.front+i)%MAXSIZE)!=Q.rear)
{
cout<<Q.base[(Q.front+i)%MAXSIZE]<<" ";
i++;
}
cout<<endl;
}
else
cout<<"循环队列为空"<<endl;
}
void Menu()
{
cout << "----------------------------------------" << endl;
cout << "**by 夏日 https://blog.csdn.net/zss192**" << endl;
cout << "----------------------------------------" << endl;
cout << "1-----顺序栈入栈"<< endl;
cout << "2-----顺序栈出栈" << endl;
cout << "3-----取栈顶元素" << endl;
cout << "4-----显示顺序栈元素" << endl;
cout << "5-----循环队列入队" << endl;
cout << "6-----循环队列出队" << endl;
cout << "7-----取循环队列队头元素" << endl;
cout << "8-----显示循环队列元素" << endl;
cout << "9-----清屏" <<endl;
cout << " 退出,输入一个负数!" << endl;
}
写在最后
本文章仅供个人复习使用,如有错误,请联系我更正。