栈和队列

该博客介绍了如何使用C++实现顺序栈和链式队列的基本操作,包括初始化、入栈、出栈、取栈顶元素、显示栈内容、入队、出队、显示队列内容等功能。通过示例代码展示了顺序栈和链式队列的完整操作流程,有助于理解栈的后进先出(LIFO)和队列的先进先出(FIFO)特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验名称   栈和队列   

实验目的:

 1. 掌握栈的顺序表示和实现

2. 掌握队列的链式表示和实现

二、实验环境:

Visual C++

三、实验内容:

(写出主要的内容)

 1. 编写一个程序实现顺序栈的各种基本运算。

2. 实现队列的链式表示和实现。

四、实验步骤

1.初始化顺序栈

2. 插入元素

3. 删除栈顶元素

4. 取栈顶元素

5. 遍历顺序栈

6. 置空顺序栈

7. 初始化并建立链队列

8. 入链队列

9. 出链队列

10. 遍历链队列

五、实现操作

 1、栈的表示和实现 

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define TRUE       1
#define FALSE      0
#define OK         1
#define ERROR      0
#define INFEASIBLE -1
#define OVERFLOW   -2
typedef int StackElementType;

//----- 栈的顺序存储表示 -----

#define  Stack_Size  100
#define  STACKINCREMENT   10

typedef struct
{
       StackElementType elem[Stack_Size]; //用来存放栈中元素的一维数组
       int top;          /*用来存放栈顶元素的下标,top为-1表示空栈*/
}SeqStack;

/*初始化顺序栈函数*/
void InitStack(SeqStack *S)
{
       /*构造一个空栈S*/
     S->top = -1;
}

/*判栈空*/
int IsEmpty(SeqStack *S) /*判断栈S为空栈时返回值为真,反之为假*/
{
       return(S->top==-1?TRUE:FALSE);
}

/*入栈函数*/
int Push(SeqStack *S,StackElementType x)
{
       //请完成本函数的功能
       if(S->top==Stack_Size-1) return (FALSE);/*栈已满*/
       S->top++;
       S->elem[S->top] = x;
       return (TRUE);
}

/*出栈函数*/
int Pop(SeqStack *S,StackElementType *x)
{ 

      /* 将栈S的栈顶元素弹出,放到x所指的存储空间中 */

       //请完成本函数的功能

       if(S->top==-1)

              return (FALSE);

       else

       {

              *x = S->elem[S->top];

              S->top--;

              return (TRUE);

       }

}

/*获取栈顶元素函数*/

int GetTop(SeqStack *S,StackElementType *x)

{ 

/* 将栈S的栈顶元素弹出,放到x所指的存储空间中,但栈顶指针保持不变 */

//请完成本函数的功能

       if(S->top == -1)

              return (FALSE);

       else

       {

              *x = S->elem[S->top];

              return (TRUE);

       }

}



int StackDisplay(SeqStack *S){//显示栈S

       int i = 0;

       if(IsEmpty(S)){

         printf("堆栈已空!\n");

         return OK;

       }

       while( i<=S->top)

              printf("[%d:%d]",++i,S->elem[i]);

       printf("\n");

       return OK;

}//StackDisplay



void main(){

       SeqStack St;

       int temp;

       int flag=1,ch;

       int e;

       printf("本程序实现顺序结构的堆栈的操作。\n");

       printf("可以进行入栈,出栈,取栈顶元素等操作。\n");

       InitStack(&St);       //初始化堆栈St

       while(flag){

              printf("请选择:\n");

              printf("1.显示栈中所有元素     \n");

              printf("2.入栈                 \n");

              printf("3.出栈                 \n");

              printf("4.取栈顶元素           \n");

              printf("5.退出程序             \n");

              scanf("%d",&ch);

              switch(ch){

              case 1:

                     StackDisplay(&St);

                     break;

              case 2:

                     printf("请输入要入栈的元素(一个整数):");

                     scanf("%d",&e);      //输入要入栈的元素

                     temp=Push(&St,e);      //入栈

                     if(temp!=TRUE) printf("堆栈已满!入栈失败!\n");

                     else {

                            printf("成功入栈!\n");  //成功入栈

                            StackDisplay(&St);

                     }

                     break;

              case 3:

                     temp=Pop(&St,&e);  //出栈

                     if(temp==FALSE) printf("堆栈已空!\n");

                     else {

                            printf("成功出栈一个元素:%d\n",e); //成功出栈

                            StackDisplay(&St);

                     }

                     break;

              case 4:

                     temp=GetTop(&St,&e); //取得栈顶元素

                     if(temp==FALSE) printf("堆栈已空!\n");

                     else printf("栈顶元素是:%d\n",e); //显示栈顶元素

                     break;

              default:

                     flag=0;

                     printf("程序结束,按任意键退出!\n");

                     getchar();

              }

       }

}

输入样例:

本程序实现顺序结构的堆栈的操作。

可以进行入栈,出栈,取栈顶元素等操作。

请选择:

1.显示栈中所有元素

2.入栈

3.出栈

4.取栈顶元素

5.退出程序

2

请输入要入栈的元素(一个整数):1

成功入栈!

[1:1]

请选择:

1.显示栈中所有元素

2.入栈

3.出栈

4.取栈顶元素

5.退出程序

2

请输入要入栈的元素(一个整数):2

成功入栈!

[1:1][2:2]

请选择:

1.显示栈中所有元素

2.入栈

3.出栈

4.取栈顶元素

5.退出程序

2

请输入要入栈的元素(一个整数):3

成功入栈!

[1:1][2:2][3:3]

请选择:

1.显示栈中所有元素

2.入栈

3.出栈

4.取栈顶元素

5.退出程序

1

[1:1][2:2][3:3]

请选择:

1.显示栈中所有元素

2.入栈

3.出栈

4.取栈顶元素

5.退出程序

4

栈顶元素是:3

请选择:

1.显示栈中所有元素

2.入栈

3.出栈

4.取栈顶元素

5.退出程序

3

成功出栈一个元素:3

[1:1][2:2]

请选择:

1.显示栈中所有元素

2.入栈

3.出栈

4.取栈顶元素

5.退出程序

5

程序结束,按任意键退出!

 

2、队列的链式表示和实现

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#define TRUE       1

#define FALSE      0

#define OK         1

#define ERROR      0



typedef int QueueElementType;



typedef struct Node

{

       QueueElementType data;     /*数据域*/

       struct Node *next;     /*指针域*/

}LinkQueueNode;



typedef struct

{

       LinkQueueNode *front;

       LinkQueueNode *rear;

}LinkQueue;



/*初始化操作。*/

int InitQueue(LinkQueue *Q)

{

       /* 将Q初始化为一个空的链队列 */

       Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));

       if(Q->front!=NULL)

       {

              Q->rear=Q->front;

              Q->front->next=NULL;

             return(TRUE);

       }

       else return(FALSE);    /* 溢出!*/

}



/*入队操作。*/

int EnterQueue(LinkQueue *Q,QueueElementType x)

{ 

       /* 将数据元素x插入到队列Q中 */

       //请完成本函数的功能

       LinkQueueNode *NewNode;

       NewNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));

       if(NewNode != NULL)

       {

              NewNode->data = x;

              NewNode->next = NULL;

              Q->rear->next = NewNode;

              Q->rear = NewNode;

              return(TRUE);

       }

       else return(FALSE);

}



/*出队操作。*/

int DeleteQueue(LinkQueue *Q,QueueElementType *x)

{ 

       /* 将队列Q的队头元素出队,并存放到x所指的存储空间中 */

       //请完成本函数的功能

       LinkQueueNode *p;

       if(Q->front == Q->rear)

              return(FALSE);

       p = Q->front->next;

       Q->front->next = p->next;

       if(Q->rear == p)

              Q->rear = Q->front;

       *x = p->data;

       free(p);

       return (TRUE);

}



int GetHead(LinkQueue *Q, QueueElementType *x)

{

       /*提取队列的队头元素,用x返回其值*/

       //请完成本函数的功能/

       if(Q->rear == Q->front)

              return(FALSE);

       else

       {

              *x = Q->front->data;

              return(TRUE);

       }

}





int DestroyLinkQueue(LinkQueue *Q)

{//销毁一个队列

       QueueElementType e;

       while(Q->front!=Q->rear)

              DeleteQueue(Q,&e);

       free(Q->front);

       Q->front=Q->rear=NULL;

       return OK;

}



int LinkQueueLength(LinkQueue *Q)

{//队列的长度

       int i=0;

       LinkQueueNode * p=Q->front;

       while(p!=Q->rear){

              ++i;

              p=p->next;

       }

       return i;

}



int DisplayLinkQueue(LinkQueue *Q)

{//显示队列中所有元素

       LinkQueueNode * p;

       int i=0;

       p=Q->front->next;

       if(p==NULL) printf("队列为空!\n");//队列为空

       else{

              while(p){       //否则显示队列中所有元素

                     printf("[%d:%d]",++i,p->data);

                     p=p->next;

              }

              printf("\n");

       }

       return OK;

}



void main(){

       LinkQueue LQ;

       QueueElementType e;

       int flag=1,ch,len;

       int temp;

       printf("本程序实现链式结构队列的操作。\n");

       printf("可以进行入队列、出队列等操作。\n");

       InitQueue(&LQ);       //初始化队列

       while(flag){

              printf("请选择:\n");

              printf("1.显示队列所有元素\n");

              printf("2.入队列\n");

              printf("3.出队列\n");

              printf("4.求队列的长度\n");

              printf("5.退出程序\n");

              scanf("%d",&ch);

              switch(ch){

              case 1:DisplayLinkQueue(&LQ);   //显示队列中所有元素

                     break;

              case 2:printf("请输入要人队的元素(一个整数):");

                     scanf("%d",&e);   //输入要入队列的字符

                     EnterQueue(&LQ,e);//入队列

                     DisplayLinkQueue(&LQ);

                     break;

              case 3:temp=DeleteQueue(&LQ,&e);  //出队列

                     if(temp==TRUE){

                            printf("出队一个元素:%d\n",e);

                            DisplayLinkQueue(&LQ);

                     }

                     else printf("队列为空!\n");

                     break;

              case 4:len=LinkQueueLength(&LQ);

                     printf("队列的长度为:%d\n",len);

                     break;

              default:flag=0;

                     printf("程序运行结束,按任意键退出!\n");

                     getchar();

              }

       }

       DestroyLinkQueue(&LQ);

}

输出样例:

本程序实现链式结构队列的操作。

可以进行入队列、出队列等操作。

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

2

请输入要人队的元素(一个整数):1

[1:1]

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

2

请输入要人队的元素(一个整数):2

[1:1][2:2]

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

2

请输入要人队的元素(一个整数):3

[1:1][2:2][3:3]

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

2

请输入要人队的元素(一个整数):4

[1:1][2:2][3:3][4:4]

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

1

[1:1][2:2][3:3][4:4]

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

4

队列的长度为:4

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

3

出队一个元素:1

[1:2][2:3][3:4]

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

3

出队一个元素:2

[1:3][2:4]

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

3

出队一个元素:3

[1:4]

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

3

出队一个元素:4

队列为空!

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

3

队列为空!

请选择:

1.显示队列所有元素

2.入队列

3.出队列

4.求队列的长度

5.退出程序

5

程序运行结束,按任意键退出!

六、心得体会:

1、在栈中,用户只能在指定的一端插入和删除元素,因此具有后进先出的特性;在队列中,用户只能在一端插入元素而在另一端删除元素,因此呈现先进先出的特性。

2、栈与队列的共同特点是在线性表端进行操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值