实验内容:
- 编程实现栈的以下基本操作:建栈、取栈顶元素、入栈、出栈。
- 编程实现队列的以下基本操作:建队列、取队头元素、入队、出队。
#include <iostream>
using namespace std;
typedef int SElemType;
typedef int QElemType;
typedef int Status;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
Status Menu();
//栈操作
//注意栈顶指针不指向元素,而指向栈顶元素的上一个位置
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用最大容量
}SqStack;
//顺序栈的初始化
Status InitStack(SqStack &S)
{
S.base=new SElemType[MAXSIZE];
if(!S.base) return ERROR;
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
//入栈操作,在栈顶插入一个新的元素
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base==S.stacksize) return ERROR;
*S.top=e;
S.top++;
cout<<"入栈成功!"<<endl;
return OK;
}
//出栈操作,删除栈顶元素
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base) return ERROR;
e=*--S.top;
cout<<"出栈成功!"<<endl;
return OK;
}
//取栈顶元素
Status GetTop(SqStack S)
{
if(S.top==S.base) return ERROR;
if(S.top!=S.base) return *(S.top-1);
}
//创建一个栈
Status Create(SqStack &S,int n){
cout<<"请输入入栈值:"<<endl;
for(int i=0;i<n;i++){
SElemType e;
cin>>e;
Push(S,e);
}
return OK;
}
//链栈操作
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
//初始化链栈
Status InitSN(LinkStack &S)
{
S=NULL;
return OK;
}
//链栈的入栈
Status PushSN(LinkStack &S,SElemType e)
{
LinkStack p=new StackNode;
p->data=e;
p->next=S;
S=p;
cout<<"入栈成功!"<<endl;
return OK;
}
//链栈的出栈
Status PopSN(LinkStack &S,SElemType &e){
if(S==NULL){
return ERROR;
}
e=S->data;
LinkStack p=new StackNode;
p=S;
S=S->next;
delete p;
return OK;
}
//取栈顶元素
Status GetTopSN(LinkStack S){
if(S!=NULL) return S->data;
}
//创建链栈
Status CreateSN(LinkStack &S,int n){
cout<<"请输入入栈值:"<<endl;
for(int i=0;i<n;i++){
SElemType e;
cin>>e;
PushSN(S,e);
}
return OK;
}
//队列操作
typedef struct{
QElemType *base;//储存的基地址
int front;
int rear;
}SqQueue;
//初始化队列
Status InitQueue(SqQueue &Q){
Q.base=new QElemType[MAXSIZE];
if(!Q.base) return ERROR;
Q.front=Q.rear=0;
return OK;
}
//求队列的长度
int QueueLength(SqQueue &Q){
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//入队
Status EnQueue(SqQueue &Q,QElemType e){
if((Q.rear+1)%MAXSIZE==Q.front) return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
cout<<"入队成功!"<<endl;
return OK;
}
//出队
Status OuQueue(SqQueue &Q,QElemType &e){
if(Q.rear==Q.front) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK;
}
//取循环队列的队头元素
Status GetHead(SqQueue &Q){
if(Q.front!=Q.rear){
return Q.base[Q.front];
}
}
//创建队列
CreateQueue(SqQueue &Q,int n){
if(n>MAXSIZE) return ERROR;
cout<<"请输入入栈值:"<<endl;
for(int i=0;i<n;i++){
QElemType e;
cin>>e;
EnQueue(Q,e);
}
return OK;
}
//链队操作
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode ,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
//链队初始化
Status InitQN(LinkQueue &Q){
Q.front=Q.rear=new QNode;
Q.front->next=NULL;
return OK;
}
//链队的入队
Status EnQN(LinkQueue &Q,QElemType e){
QueuePtr p=new QNode;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
cout<<"入队成功!"<<endl;
return OK;
}
//链队的出队
Status OuQN(LinkQueue &Q,QElemType &e){
if(Q.rear==Q.front) return ERROR;
QueuePtr p=new QNode;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
delete p;
return OK;
}
//取队头元素
Status GetHeadN(LinkQueue &Q){
if(Q.front!=Q.rear)
return Q.front->next->data;
}
//创建链栈
CreateQN(LinkQueue &Q,int n){
if(n>MAXSIZE) return ERROR;
cout<<"请输入入栈值:"<<endl;
for(int i=0;i<n;i++){
QElemType e;
cin>>e;
EnQN(Q,e);
}
return OK;
}
Status Switch1(SqStack &S,int &a){
switch(a){
case 1:
InitStack(S);
int len;
cout<<"栈建造并初始化成功!"<<endl;
cout<<"请输入想要建立的栈的长度:"<<endl;
cin>>len;
Create(S,len);
cout<<"创建成功!"<<endl;
break;
//出栈
case 2:
SElemType e1;
Pop(S,e1);
cout<<"删除的栈顶元素为:"<<e1<<endl;
break;
//入栈
case 3:
SElemType e2;
cout<<"请输入想要插入的栈顶值:"<<endl;
cin>>e2;
Push(S,e2);
break;
//取栈顶元素
case 4:
SElemType e3;
e3=GetTop(S);
cout<<"栈顶元素为:"<<e3<<endl;
break;
case 5:
a=0;
return 0;
}
}
Status Menu1(){
cout<<"-----栈的基本操作----"<<endl;
cout<<"------1.栈的建立-----"<<endl;
cout<<"--------2.出栈-------"<<endl;
cout<<"--------3.入栈-------"<<endl;
cout<<"----4.取栈顶元素-----"<<endl;
cout<<"----5.退出栈操作-----"<<endl;
int a=100;
SqStack S;
while(a>0){
int A;
cout<<"请输入操作编号:"<<endl;
cin>>A;
a=A;
if(a>=6){
cout<<"非法输入!"<<endl;
continue;
}
Switch1(S,a);
}
return OK;
}
Status Switch2(LinkStack &S,int &b){
switch(b){
case 1:
InitSN(S);
int len1;
cout<<"链栈建造并初始化成功!"<<endl;
cout<<"请输入想要建立的链栈的长度:"<<endl;
cin>>len1;
CreateSN(S,len1);
cout<<"创建成功!"<<endl;
break;
//出栈
case 2:
SElemType e1;
PopSN(S,e1);
cout<<"删除的链栈顶元素为:"<<e1<<endl;
break;
//入栈
case 3:
SElemType e2;
cout<<"请输入想要插入的链栈顶值:"<<endl;
cin>>e2;
PushSN(S,e2);
break;
//取栈顶元素
case 4:
SElemType e3;
e3=GetTopSN(S);
cout<<"栈顶元素为:"<<e3<<endl;
break;
case 5:
b=0;
return 0;
}
}
Status Menu2(){
cout<<"-----链栈的基本操作----"<<endl;
cout<<"------1.链栈的建立-----"<<endl;
cout<<"--------2.出栈--------"<<endl;
cout<<"--------3.入栈--------"<<endl;
cout<<"-----4.取栈顶元素-----"<<endl;
cout<<"----5.退出链栈操作----"<<endl;
int b=100;
LinkStack S;
while(b>0){
int B;
cout<<"请输入操作编号:"<<endl;
cin>>B;
b=B;
if(b>=6){
cout<<"非法输入!"<<endl;
continue;
}
Switch2(S,b);
}
return OK;
}
Status Switch3(SqQueue &Q,int &b){
switch(b){
case 1:
InitQueue(Q);
int len1;
cout<<"队列建造并初始化成功!"<<endl;
cout<<"请输入想要建立队列的长度:"<<endl;
cin>>len1;
CreateQueue(Q,len1);
cout<<"创建成功!"<<endl;
break;
case 2:
QElemType e1;
OuQueue(Q,e1);
cout<<"删除的队列元素为:"<<e1<<endl;
break;
case 3:
QElemType e2;
cout<<"请输入想要插入的队列值:"<<endl;
cin>>e2;
EnQueue(Q,e2);
break;
case 4:
QElemType e3;
e3=GetHead(Q);
cout<<"队头元素为:"<<e3<<endl;
break;
case 5:
int len;
len=QueueLength(Q);
cout<<"队头长度为:"<<len<<endl;
break;
case 6:
b=0;
return 0;
}
}
Status Menu3(){
cout<<"-----队列的基本操作----"<<endl;
cout<<"------1.队列的建立-----"<<endl;
cout<<"--------2.出队--------"<<endl;
cout<<"--------3.入队--------"<<endl;
cout<<"--4.取循环队列头元素--"<<endl;
cout<<"-----5.队列的长度-----"<<endl;
cout<<"----6.退出链栈操作----"<<endl;
int b=100;
SqQueue Q;
while(b>0){
int B;
cout<<"请输入操作编号:"<<endl;
cin>>B;
b=B;
if(b>=7){
cout<<"非法输入!"<<endl;
continue;
}
Switch3(Q,b);
}
return OK;
}
Status Switch4(LinkQueue &Q,int &b){
switch(b){
case 1:
InitQN(Q);
int len1;
cout<<"链队建造并初始化成功!"<<endl;
cout<<"请输入想要建立链队的长度:"<<endl;
cin>>len1;
CreateQN(Q,len1);
cout<<"创建成功!"<<endl;
break;
case 2:
QElemType e1;
OuQN(Q,e1);
cout<<"删除的链队元素为:"<<e1<<endl;
break;
case 3:
QElemType e2;
cout<<"请输入想要插入的队列值:"<<endl;
cin>>e2;
EnQN(Q,e2);
break;
case 4:
QElemType e3;
e3=GetHeadN(Q);
cout<<"队头元素为:"<<e3<<endl;
break;
case 5:
b=0;
return 0;
}
}
Status Menu4(){
cout<<"-----链队的基本操作----"<<endl;
cout<<"------1.链队的建立-----"<<endl;
cout<<"--------2.出队--------"<<endl;
cout<<"--------3.入队--------"<<endl;
cout<<"--4.取循环队列头元素--"<<endl;
cout<<"----5.退出链栈操作----"<<endl;
int b=100;
LinkQueue Q;
while(b>0){
int B;
cout<<"请输入操作编号:"<<endl;
cin>>B;
b=B;
if(b>=6){
cout<<"非法输入!"<<endl;
continue;
}
Switch4(Q,b);
}
return OK;
}
Status Menu(){
cout<<"-----可选择的操作-----"<<endl;
cout<<"----1.栈的基本操作----"<<endl;
cout<<"---2.链栈的基本操作---"<<endl;
cout<<"---3.队列的基本操作---"<<endl;
cout<<"---4.链队的基本操作---"<<endl;
cout<<"--------5.退出--------"<<endl;
}
Status Switch(){
int ch0=0;
while(ch0>=0){
Menu();
int ch;
cout<<"请输入操作编号:"<<endl;
cin>>ch;
ch0=ch;
if(ch0>=6){
cout<<"非法输入!"<<endl;
continue;
}
switch(ch0){
case 1:
Menu1();
break;
case 2:
Menu2();
break;
case 3:
Menu3();
break;
case 4:
Menu4();
break;
case 5:
cout<<"退出程序!"<<endl;
return 0;
}
}
}
int main(){
Switch();
return 0;
}