前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构——入栈,出栈,队列相关操作(C语言实现)

数据结构——入栈,出栈,队列相关操作(C语言实现)

作者头像
Gorit
发布2021-12-09 16:05:50
6160
发布2021-12-09 16:05:50
举报
文章被收录于专栏:Gorit 带你学全栈系列

阅读过程之中可能会花费比较多的时间:建议直接翻到最后,有完整的代码可以使用

(tips:仅供学习使用)

程序准备工作

代码语言:javascript
复制
#include 
#include 
#include 
#include
#define MaxSize  100					//最大元素个数
typedef  int  ElemType;
typedef struct  							//顺序栈的类型定义
{
    ElemType data[MaxSize];	 		//栈元素存储空间
    int top; 							//栈顶指针
}SeqStack;
typedef struct  							//循环顺序队的类型定义
{
    ElemType data[MaxSize];		//队列元素存储空间
    int front;					 	//队头指针
    int rear; 						//队尾指针
}CircSeqQueue;

先准备工作看看程序运行的结果

栈表具有先进后出后进后出的功能:

下面看看功能的实现

下面看看入栈出栈读取栈顶元素栈置空的函数的实现

代码语言:javascript
复制
void StackInitial(SeqStack *pS) 			//创建一个由指针pS所指向的空栈
{
    pS->top= -1;
}
int isEmpty(SeqStack *pS) 				//顺序栈为空时返回1,否则返回。
{
    return pS->top== -1;
}
int isFull (SeqStack * pS) 				//栈为满时返回1,否则返回0
{
    return pS->top >=MaxSize-1;
}
void Push(SeqStack *pS, ElemType e) 	//若栈不满,则元素e进栈
{
   if(pS->top==MaxSize-1)
   {
  		printf("栈满\n"); 
   		return ;
   }
   
   	else {
   		pS->top++;
   		pS->data[pS->top]=e;
   		return ;
	   }
}
ElemType Pop(SeqStack *pS) 	//若栈不为空,则删除栈顶元素,并返回它的值
{
	if(isEmpty(pS))
   		return -1;
    else{
    
    	return pS->data[pS->top--];
    
	}
    
}
ElemType GetTop(SeqStack  *pS) 	//若栈不为空,则返回栈顶元素的值
{
   	if(isEmpty(pS))
        return -1;
    else
    	return pS->data[pS->top];
   
}
void MakeEmpty(SeqStack *pS) 		//将由指针pS所指向的栈变为空栈
{
  return pS->top= -1;
}

队列操作,这次的队列我用的是循环队列,队列的主要功能先进先出,后进后出,也就可以类比排队

代码语言:javascript
复制
int IsEmpty(CircSeqQueue *pQ) 	//循环顺序队列为空时返回1,否则返回0
{
    return pQ->front==pQ->rear;
}
int IsFull(CircSeqQueue *pQ)     	//循环队列为满时返回1,否则返回。
{
    return(pQ->rear+1) %MaxSize==pQ->front;
}
void EnQueue(CircSeqQueue *pQ,ElemType e)
{
//若队列不满,则元素e进队
 if((pQ->rear+1)%MaxSize==pQ->front)
 {
 	 	printf("队满!\n");
 		return ;
 }
	else{
		pQ->data[pQ->rear]=e;
		pQ->rear=(pQ->rear+1)%MaxSize;
		return ; 
	}
}
ElemType DeQueue(CircSeqQueue *pQ)
{
//若循环队列不为空,则删除队头元素,并返回它的值
     if(pQ->rear==pQ->front)
		 {
 	 	printf("空队!\n");
 		return 0;
		 }
	else{
		return pQ->data[pQ->front++];
	}
}
ElemType GetFront(CircSeqQueue *pQ)  //若队列不为空,则返回队头元素值
{
    if (IsEmpty(pQ))
    {
        printf("空队列! \n");
        exit(1);
    }
    return pQ->data[(pQ->front)%MaxSize];
}
void MakeEmpty2(CircSeqQueue *pQ) 	//将指针pQ所指向的队列变为空
{
   pQ->front=pQ->rear=0; 
}

复制进C编辑器即可使用

代码语言:javascript
复制
#include 
#include 
#include 
#include
#define MaxSize  100					//最大元素个数
typedef  int  ElemType;
typedef struct  							//顺序栈的类型定义
{
    ElemType data[MaxSize];	 		//栈元素存储空间
    int top; 							//栈顶指针
}SeqStack;
typedef struct  							//循环顺序队的类型定义
{
    ElemType data[MaxSize];		//队列元素存储空间
    int front;					 	//队头指针
    int rear; 						//队尾指针
}CircSeqQueue;
void StackInitial(SeqStack *pS) 			//创建一个由指针pS所指向的空栈
{
    pS->top= -1;
}
int isEmpty(SeqStack *pS) 				//顺序栈为空时返回1,否则返回。
{
    return pS->top== -1;
}
int isFull (SeqStack * pS) 				//栈为满时返回1,否则返回0
{
    return pS->top >=MaxSize-1;
}
void Push(SeqStack *pS, ElemType e) 	//若栈不满,则元素e进栈
{
   if(pS->top==MaxSize-1)
   {
  		printf("栈满\n"); 
   		return ;
   }
   
   	else {
   		pS->top++;
   		pS->data[pS->top]=e;
   		return ;
	   }
}
ElemType Pop(SeqStack *pS) 	//若栈不为空,则删除栈顶元素,并返回它的值
{
	if(isEmpty(pS))
   		return -1;
    else{
    
    	return pS->data[pS->top--];
    
	}
    
}
ElemType GetTop(SeqStack  *pS) 	//若栈不为空,则返回栈顶元素的值
{
   	if(isEmpty(pS))
        return -1;
    else
    	return pS->data[pS->top];
   
}
void MakeEmpty(SeqStack *pS) 		//将由指针pS所指向的栈变为空栈
{
  return pS->top= -1;
}
void QueueInitial(CircSeqQueue *pQ)
{
//创建一个由指针PQ所指向的空顺序循环队列
    pQ->front=pQ->rear=0;
}
int IsEmpty(CircSeqQueue *pQ) 	//循环顺序队列为空时返回1,否则返回0
{
    return pQ->front==pQ->rear;
}
int IsFull(CircSeqQueue *pQ)     	//循环队列为满时返回1,否则返回。
{
    return(pQ->rear+1) %MaxSize==pQ->front;
}
void EnQueue(CircSeqQueue *pQ,ElemType e)
{
//若队列不满,则元素e进队
 if((pQ->rear+1)%MaxSize==pQ->front)
 {
 	 	printf("队满!\n");
 		return ;
 }
	else{
		pQ->data[pQ->rear]=e;
		pQ->rear=(pQ->rear+1)%MaxSize;
		return ; 
	}
}
ElemType DeQueue(CircSeqQueue *pQ)
{
//若循环队列不为空,则删除队头元素,并返回它的值
     if(pQ->rear==pQ->front)
		 {
 	 	printf("空队!\n");
 		return 0;
		 }
	else{
		return pQ->data[pQ->front++];
	}
}
ElemType GetFront(CircSeqQueue *pQ)  //若队列不为空,则返回队头元素值
{
    if (IsEmpty(pQ))
    {
        printf("空队列! \n");
        exit(1);
    }
    return pQ->data[(pQ->front)%MaxSize];
}
void MakeEmpty2(CircSeqQueue *pQ) 	//将指针pQ所指向的队列变为空
{
   pQ->front=pQ->rear=0; 
}
void output()
{
    int i;
    for (i=0;i<10; i++)
        printf(" ");
    for (i=0; i< 32; i++)
        printf("*");
    printf("\n");
}
void main1()
{
    int i;
    output();
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("1.入栈一个元素");
    for (i=0; i< 16; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("2.出栈一个元素");
    for (i=0; i< 16; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("3.读栈顶元素");
    for (i=0; i< 16; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("4.置栈空");
    for (i=0; i< 16; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("5.入队一个元素");
    for (i=0; i< 16; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("6.出队一个元素");
    for (i=0; i< 16; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("7.读队首元素");
    for (i=0; i< 14; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("8.置队空");
    for (i=0; i< 18; i++) printf("  ");
    printf("*");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("0.退      出");
    for (i=0; i< 8; i++) printf("  ");
    printf("*");
    printf("\n");
    output();
}
void main () 				//主函数
{
    SeqStack *pS;
    CircSeqQueue*pQ;
    ElemType e;
    int k=1,m,i,n,c,d;
    pS=(SeqStack *)malloc(sizeof(SeqStack));
    StackInitial(pS);
    pQ=(CircSeqQueue *)malloc(sizeof(CircSeqQueue));
    QueueInitial(pQ);
    main1();
    while (k)
    {
        printf("请选择0一8:");
        scanf ("%d", &m);
        switch (m)
        {
        case 0:
            return;
        case 1:
        {
            printf("输入数n,再输入n个元素,入栈:");
            scanf ("%d", &n);
            for (i=0;i
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/11/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档