栈与队列(C语言)

本文介绍数据结构的栈与队列C语言实现方法。以及源代码

队列(Queue):

“先进先出”的数据结构. 队列 是 线性表 的一种,在操作数据元素时,和 栈 一样,有自己的规则: 使用队列存取数据元素时,数据元素只能从表的一端进入队列,另一端出队列 ,如 图 1。. 称进入队列的一端为“队尾”;出队列的一端为“队头”。. 数据元素全部由队尾陆续进队列,由队头陆续出队列。.

栈(stack):

又名堆栈,它是一种运算受限线性表。限定仅在表尾进行插入删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

代码展示:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include<process.h>
#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;
}

void Push(SeqStack *pS, ElemType e) 	//若栈不满,则元素e进栈
{
   if(pS->top==MaxSize-1)
   {
   	printf("栈满");
   }
   else{
   	pS->top++;
   	pS->data[pS->top]=e;
   }
}

void Pop(SeqStack *pS) 	//若栈不为空,则删除栈顶元素,并返回它的值
{
   if(pS->top==-1)
   {
   	printf("栈空\n");
   }
   	else{
   		 printf("出栈数为 %d",pS->data[pS->top]);
			pS->top--;
			printf("\n");
	   }
   }


void GetTop(SeqStack  *pS) 	//若栈不为空,则返回栈顶元素的值
{
   if(pS->top==-1)
   {
   	printf("栈空\n");
   }
   	else{
   		 printf("当前栈顶数为 %d",pS->data[pS->top]);
   		 printf("\n");

	   }
   }

void MakeEmpty(SeqStack *pS) 		//将由指针pS所指向的栈变为空栈
{
  pS->top=-1;
  printf("栈已清空 \n");
}

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)
{
	if((pQ->rear+1)%MaxSize==pQ->front){
		printf("队满\n");
	}
	else{
		pQ->data[pQ->rear]=e;
		pQ->rear=(pQ->rear+1)%MaxSize;
	}
//若队列不满,则元素e进队
}

void DeQueue(CircSeqQueue *pQ)
{
	if(pQ->front==pQ->rear){
		printf("队空无元素");
	}
	else {
		printf("出队元素为 %d\n", pQ->data[pQ->front]);
		pQ->front=(pQ->front+1)%MaxSize;
	}
//若循环队列不为空,则删除队头元素,并返回它的值
}

void GetFront(CircSeqQueue *pQ)  //若队列不为空,则返回队头元素值
{
   if(pQ->front==pQ->rear){
		printf("队空无元素\n");
	}
	else {
		printf("队头元素为 %d \n",pQ->data[pQ->front]);
	}
}
void MakeEmpty2(CircSeqQueue *pQ) 	//将指针pQ所指向的队列变为空
{
 pQ->front==pQ->rear;
}

void output()
{
    int i;
    for (i=0;i<20; i++)
        printf(" ");
    for (i=0; i< 28; 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("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("2.出栈一个元素      *");
    for (i=0; i< 16; i++) printf("  ");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("3.读栈顶元素        *");
    for (i=0; i< 16; i++) printf("  ");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("4.置栈空            *");
    for (i=0; i< 16; i++) printf("  ");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("5.入队一个元素      *");
    for (i=0; i< 16; i++) printf("  ");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("6.出队一个元素      *");
    for (i=0; i< 16; i++) printf("  ");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("7.读队首元素        *");
    for (i=0; i< 14; i++) printf("  ");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("8.置队空            *");
    for (i=0; i< 18; i++) printf("  ");
    printf("\n");
    for (i=0; i< 10; i++)printf("  ");
    printf("*     ");
    printf("0.退      出        *");
    for (i=0; i< 8; i++) 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);                                                    //20 创建空栈初始化
    pQ=(CircSeqQueue *)malloc(sizeof(CircSeqQueue));
    QueueInitial(pQ);                                                    //55创建空循环队列
    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<n;i++)
            {
                scanf ("%d", &e);
                Push(pS,e);                                          //33存入栈
            }
            break;
        }
        case 2:
        {
            Pop(pS);                                               //38出栈
            printf("\n");
            break;
        }
        case 3:
        {
            printf ("取出栈顶元素:  ");
            GetTop(pS);                                           //44读取栈顶
            printf ("\n");
            break;
        }
        case 4:
        {
            printf("置栈空:\n");
            MakeEmpty(pS);                                          //50
            printf ("\n");
            break;
        }
        case 5:
        {
            printf("输入入队元素个数:");
            scanf ("%d", &c);
            printf("输入入队元素:\n");
            for (i=0;i<c;i++)
            {
                scanf ("%d", &e);
                EnQueue(pQ,e);                                     //69存队列
            }
            break;
        }
        case 6:
        {
            printf("请输入出队元素的个数:");
            scanf ("%d", &c);
            for (i=0;i<c;i++)
            {
                DeQueue (pQ);                                  //74 出队
            }
            break;
        }
        case 7:
        {
            printf ("取出队首元素:\n");
            GetFront(pQ);                                     //79读取队首
            break;
        }
        case 8:
        {
            printf("置队空:\n");
            MakeEmpty2(pQ);                                    //84
            printf ("\n");
            break;
        }
        default:
            return;
        }
        printf ("继续运行吗Y /N");
        scanf("%d",&k);
        if (k=='n'||k=='N') return;
        fflush(stdin);
        main1();

    }
}

运行展示:

创建栈

出栈操作

 

清空栈

 

创建队列

 

元素出队

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值