本文介绍数据结构的栈与队列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();
}
}
运行展示:
创建栈
出栈操作
清空栈
创建队列
元素出队