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

2021-12-09 16:05:50 浏览数 (1)

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

(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

0 人点赞