栈:
#include <iostream>
#include<stdio.h>
#define size 10
#define insize 10
#define OK 1
#define ERROR 0
#include<malloc.h>
using namespace std;
typedef struct{
int *base;
int *top;
int stacksize;
}stack;
int Initstack(stack &s);//建立空栈
int Push(stack &s,int e);//压栈函数 将e中的值压入栈顶
int Pop(stack &s,int&e);//将栈顶元素用e返回
int StackLength(stack s);//返回栈的元素个数,即栈的长度
int OperateMenu();//建立菜单,提示操作代码
int GetTop(stack s,int &e);//返回栈顶元素
int DestroyStack(stack &s);//销毁栈
int ClearStack(stack &s);//清空栈中所有元素
int scanfs(stack &s);//向栈中输入元素
void print(stack s);//将栈中元素全部弹出并打印
int main()
{
stack s;
s.base=NULL;
int e;
char ch;
printf("是否要进行操作?(继续输入Y或者y,否则结束)\n");
scanf("%c",&ch);
while(ch=='Y'||ch=='y'){
switch(OperateMenu()){
case 1:
Initstack(s);
if(s.base!=NULL)printf("创建成功!\n");
break;
case 2:
if(s.base==NULL){
printf("请先建栈!\n");
break;
}
else{
scanfs(s);
if(s.base!=s.top)printf("输入成功!\n");
break;
}
case 3:
if(s.base==NULL){
printf("请先建栈!\n");
break;
}
else {
int n=StackLength(s);
printf("请输入进栈元素:\n");
scanf("%d",&e);
Push(s,e);
if(StackLength(s)>n)printf("压入成功!\n");
break;
}
case 4:
if(s.base==NULL){
printf("请先建栈!\n");
break;
}else{
GetTop(s,e);
printf("栈顶元素为%d\n",e);
break;
}
case 5:
if(s.base==NULL){
printf("请先建栈!\n");
break;
}else{
if(s.top!=s.base){
printf("栈中全部元素为:");
print(s);
break;
}else{printf("该栈为空栈!\n");break;}
}
case 6:
if(s.base==NULL){
printf("请先建栈!\n");
break;
}else{
printf("栈中元素个数为:%d",StackLength(s));
break;
}
case 7:
if(s.base==NULL){
printf("请先建栈!\n");
break;
}else{
Pop(s,e);
printf("栈弹出栈顶元素为:%d",e);
break;
}
case 8:
if(s.base==NULL){
printf("请先建栈!\n");
break;
}else{
DestroyStack(s);
break;
}
case 9:
if(s.base==NULL){
printf("请先建栈!\n");
break;
}else{
ClearStack(s);
break;
}
}
printf("\n是否还要继续操作?(继续输入Y或者y,否则结束)\n");
ch=getchar();
scanf("%c",&ch);
}
}
int Initstack(stack &s){//建立空栈
s.base=(int*)malloc(size*sizeof(int));
if(!s.base)return ERROR;
s.top=s.base;
s.stacksize=size;
return OK;
}
int Push(stack &s,int e){//压栈函数 将e中的值压入栈顶
if(s.top-s.base>=s.stacksize){
s.base=(int*)realloc(s.base,(s.stacksize+insize)*sizeof(int));
if(!s.base)return ERROR;
s.top=s.base+s.stacksize;
s.stacksize+=insize;
}
*s.top++=e;
return OK;
}
int Pop(stack &s,int&e){//将栈顶元素用e返回
if(s.top==s.base)return ERROR;
e=*--s.top;
return OK;
}
int StackLength(stack s){//返回栈的元素个数,即栈的长度
return s.top-s.base;
}
int GetTop(stack s,int &e){//返回栈顶元素
if(s.base==s.top)return ERROR;
e=*(--s.top);
return OK;
}
int DestroyStack(stack &s){//销毁栈
if(s.base){
free(s.base);
s.stacksize=0;
printf("销毁成功!\n");
s.base=s.top=NULL;
}
return OK;
}
int ClearStack(stack &s){//清空栈中所有元素
if(s.base!=s.top){
s.base=s.top;
s.stacksize=size;
printf("清空成功!\n");
}
}
int OperateMenu(){//建立菜单,提示操作代码
int num;
printf("---------------------------------\n");
printf("1:建立空栈!\n2:输入数据!\n3:向栈顶压入一个元素!\n4:获得栈顶元素并打印!\n5:将栈中所有元素打印出来!\n6:返回栈的元素个数!\n7:弹出栈顶元素并打印!\n8:选择销毁栈!\n9:清空栈中的内容!\n");//提供菜单选项
scanf("%d",&num);
for(int i=0;;i++){
if(num<1||num>9){printf("选择错误!");return -1;}
else if(num==1){return num;break;}
else if(num==2){return num;break;}
else if(num==3){return num;break;}
else if(num==4){return num;break;}
else if(num==5){return num;break;}
else if(num==6){return num;break;}
else if(num==7){return num;break;}
else if(num==8){return num;break;}
else if(num==9){return num;break;}
}
}
int scanfs(stack &s){//向栈中输入元素
int e;
printf("请输入:(输入-1结束)");
for(int i=0;;i++){
scanf("%d",&e);
if(e==-1)break;
Push(s,e);
}
return OK;
}
void print(stack s){//将栈中元素全部弹出并打印
int e;
for(int i=0;;i++){
if(s.top==s.base)break;
Pop(s,e);
printf("%d\t",e);
}
}
实验结果:
- 栈的建立
- 栈的初始化(输入1 2 3 4 5 6 7 8 9 ,-1结束)
- 入栈并打印内容(输入10)
- 出栈
- 清空栈并查看
- 销毁栈并判断栈空
队列:
实验代码:
#include <iostream>
#include<stdio.h>
#define size 10
#define insize 10
#define OK 1
#define ERROR 0
#include<malloc.h>
using namespace std;
typedef struct{
int *base;//初始化的动态分配空间
int front;
int rear;
int qlist;
}Sq;
int InitQueue(Sq &q);//构造一个空队列q
int QueueLength(Sq q);//返回q的元素个数,即队列长度
int EnQueue(Sq &q,int e);//插入元素e为q的新元素
int DeQueue(Sq &q,int &e);//若队列不空,则删除q的队头元素,并用e返回其值
int GetHead(Sq &q,int &e);//用e返回队头元素
int DestroyQueue(Sq &q);//若队列存在,将队列销毁
int ClearQueue(Sq &q);//若队列存在,清空队列元素
int OperateMenu();//建立菜单,提示操作代码
int scanfs(Sq &q);//向队列中输入元素
void print(Sq q);//将队列中元素全部弹出并打印
int main()
{
Sq s;
s.base=NULL;
int e;
char ch;
printf("是否要进行操作?(继续输入Y或者y,否则结束)\n");
scanf("%c",&ch);
while(ch=='Y'||ch=='y'){
switch(OperateMenu()){
case 1:
InitQueue(s);
if(s.base!=NULL)printf("创建成功!\n");
break;
case 2:
if(s.base==NULL){
printf("请先建队列!\n");
break;
}
else{
scanfs(s);
if(s.rear!=s.front)printf("输入成功!\n");
break;
}
case 3:
if(s.base==NULL){
printf("请先建队列!\n");
break;
}
else {
int n=QueueLength(s);
printf("请输入添加队尾元素:\n");
scanf("%d",&e);
EnQueue(s,e);
if(QueueLength(s)>n)printf("添加成功!\n");
break;
}
case 4:
if(s.base==NULL){
printf("请先建队列!\n");
break;
}
else {
GetHead(s,e);
printf("队头元素为%d",e);
break;
}
case 5:
if(s.base==NULL){
printf("请先建队列!\n");
break;
}else{
if(s.front!=s.rear){
printf("队列中全部元素为:");
print(s);
break;
}else{printf("该队列为空队列!\n");break;}
}
case 6:
if(s.base==NULL){
printf("请先建队列!\n");
break;
}else{
printf("队列中元素个数为:%d",QueueLength(s));
break;
}
case 7:
if(s.base==NULL){
printf("请先建队列!\n");
break;
}else{
DeQueue(s,e);
printf("删除的队头元素为:%d",e);
break;
}
case 8:
if(s.base==NULL){
printf("请先建队列!\n");
break;
}else{
DestroyQueue(s);
if(s.base==NULL)printf("销毁成功!\n");
break;
}
case 9:
if(s.base==NULL){
printf("请先建队列!\n");
break;
}else{
ClearQueue(s);
if(s.front==s.rear)printf("清空成功!\n");
break;
}
}
printf("\n是否还要继续操作?(继续输入Y或者y,否则结束)\n");
ch=getchar();
scanf("%c",&ch);
}
}
int InitQueue(Sq &q){//构造一个空队列q
q.base=(int*)malloc(size*sizeof(int));//分配一定大小的空间
if(!q.base)return ERROR;//分配空间失败
q.front=q.rear=0;
q.qlist=size;
return OK;
}
int QueueLength(Sq q){//返回q的元素个数,即队列长度
return (q.rear+q.qlist-q.front)%q.qlist;
}
int EnQueue(Sq &q,int e){//插入元素e为q的新元素
int *n,p,r;
if((q.rear+1)%q.qlist==q.front){
n=(int*)realloc(q.base,(q.qlist+insize)*sizeof(int));//在在原空间增加一点空间
if(!n)return ERROR;
q.base=n;
p=q.qlist;//保存新加的空间位置
q.qlist+=insize;
if(q.rear<q.front){//如果追加的空间在队尾之后,因为顺序队列需要连续使用,所以需要将存储在对头之前的元素移动到后面
r=0;//记录需要转移的位置
for(r;q.rear-r>0;r++){
q.base[p]=q.base[r];
p++;//交换值之后位置加一,循环继续执行
}
q.rear=p;//修改队尾位置
}
}//若空间不够则追加insize大小的空间
q.base[q.rear]=e;
q.rear=(q.rear+1)%q.qlist;
return OK;
}
int DeQueue(Sq &q,int &e){//若队列不空,则删除q的队头元素,并用e返回其值
if(q.front==q.rear)return ERROR;
e=q.base[q.front];
q.front=(q.front+1)%q.qlist;
return OK;
}
int GetHead(Sq &q,int &e){//用e返回队头元素
e= q.base[q.front];
return OK;
}
int DestroyQueue(Sq &q){//若队列存在,将队列销毁
if(q.base!=NULL){
free(q.base);
q.base=NULL;
}
return OK;
}
int ClearQueue(Sq &q){//若队列存在,清空队列元素
q.front=q.rear;
q.qlist=size;
return OK;
}
int OperateMenu(){//建立菜单,提示操作代码
int num;
printf("---------------------------------\n");
printf("1:建立空队列!\n2:输入数据!\n3:向队尾加入一个元素!\n4:获得队头元素并打印!\n5:将队列中所有元素打印出来!\n6:返回队列的元素个数!\n7:删除队头元素并打印!\n8:选择销毁队列!\n9:清空队列中的内容!\n");//提供菜单选项
scanf("%d",&num);
for(int i=0;;i++){
if(num<1||num>9){printf("选择错误!");return -1;}
else if(num==1){return num;break;}
else if(num==2){return num;break;}
else if(num==3){return num;break;}
else if(num==4){return num;break;}
else if(num==5){return num;break;}
else if(num==6){return num;break;}
else if(num==7){return num;break;}
else if(num==8){return num;break;}
else if(num==9){return num;break;}
}
}
int scanfs(Sq &q){//向队列中输入元素
int e;
printf("请输入:(输入-1结束)");
for(int i=0;; i++)
{
scanf("%d",&e);
if(e==-1)break;
EnQueue(q,e);
}
return OK;
}
void print(Sq q){//将队列中元素全部弹出并打印
int e;
for(int i=0;; i++)
{
if(q.front==q.rear)break;
DeQueue(q,e);
printf("%d\t",e);
}
}
实验结果:
- 建立空队列
- 初始化队列(输入1 2 3 4 5 6 7 8 9 ,-1结束)
- 入队列并打印(输入10)
- 出队列(删除队头元素)
- 获得队头元素
- 清空队列并判断
- 销毁队列并判断