数据结构(三)——栈和队列

本文详细介绍了栈和队列这两种基本数据结构。栈是限定在表尾进行插入或删除的后进先出(LIFO)线性表,常用于表达式求值、括号匹配等问题;队列则是在一端插入(队尾)并在另一端删除(队头)的先进先出(FIFO)线性表,常见于任务调度和缓冲区管理。同时,文中还提供了栈和链栈的操作实现,包括初始化、入栈、出栈、取栈顶元素和销毁等。此外,还展示了如何使用栈进行进制转换。
摘要由CSDN通过智能技术生成

栈和队列

定义以及特点

限定仅在表尾进行插入或删除的,后进先出的线性表
在这里插入图片描述

栈顶指针与栈底指针

base:栈底指针,始终指向栈底位置。若base=NULL,表明栈结构不存在。
top:栈顶指针,初值指向栈底。插入新元素时top+1,删除元素时top-1.。
空栈时,top与base的值相等,均指向栈底;非空时top始终指向栈顶元素的上一个位置。
在这里插入图片描述

操作

顺序栈的定义

#define MAXSIZE 100;
typedef struct
{
  SElemType *base;
  SElemType *top;
  int stacksize;                          //栈可用的最大容量
}SqStack;

初始化

Status InitStack(SqStack &S)
{
   S.base=new SElemType[MAXSIZE];      //为顺序栈分配一个最大容量为MAXSIZE的数组空间
   if(!S=base) exit(OVERFLOW);         //存储分配失败
   S.top = S.base;
   S.stacksize=MAXSIZE;
   return OK;
}

入栈

Status Push(SqStack &S,SElemType e)
{
  if(S.top-S.base==S.stacksize) return ERROR;
  *S.top++=e;     //*S.top=e;S.top++;
  return OK;
}

出栈

Status Pop(SqStack &S,SElemType e)
{
  if(S.top==S.base) return ERROR;
  e=*--S.top;
  return OK;
}

取栈顶元素

SElemType GetTop(SqStack S)
{
   if(S.top==S.base)
   return *(S.top-1);
}

销毁

void DestroyStack(SqStack &S)
{
  delete []S.base;
  S.stacksize=0;
  S.base=S.top=NULL;
 }

链栈

:链栈中一般不设置头结点

定义

typedef struct Node
{
 SElemType data;
 struct Node *next;
}Node,*LinkStack; 

初始化

Status InitStack(LinkStack &S)    //S:栈顶指针
{
   S==NULL;
   return OK;
}

栈空

bool StackEmpty(LinkStack S)
{
  return (S==NULL);

栈长

int StackLength(LinkStack S)
{
   for(i=0,p=S;p;i++,p=p->next);
   return i;
}   

取栈顶元素

Status GetTop(LinkStack S,SElemType &e)
{
   if(S==NULL) return ERROR;
   e=S->data;
   return OK;
}  

出栈

Status Pop(LinkStack &S,SElemType e)
{
  if(S==NULL) return ERROR;
  e=S->data;
  p=S;
  S=S->next;
  delete p;
  return OK;
}

入栈

Status Push(LinkStack &S,SElemType e)
{
  p=new StackNode;
  p->data=e;
  p->next=S;
  S=p;
  return OK;
}

队列

定义以及队列

仅允许在表的一端进行插入(队尾),在另一端进行删除的(队头),先进先出的线性表
在这里插入图片描述

进制转换

void conversion(int N,int r){
InitStack(S);
while(N)
{
   Push(S,N%r);
   N=N/r;
}
while(!StackEmpty(S)){
   Pop(S,e);
   if(e<10)printf("%d",e);
   else printf("%c",'A'+e-10);
}  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值