数据结构(二)---栈、队列

:一种特殊的线性表只允许在固定的一段进行插入和删除操作,进行数据操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先进后出的原则;
栈的示意图:
在这里插入图片描述
栈结构的代码实现(采用顺序表):

typedef struct stack {
    char* arr;
    int size;
    int capacity;
    }stack;

栈的操作
1、压栈:栈的插入操作;
代码实现:

void stackPush(stack* s,char c) {
    if(s->size == s->capacity) {
           s->capacity = s->capacity*2;        
           s->arr = (char*) realloc(s->arr,sizeof(char) * s->capacity);    
     }    
     s->arr[s->size++] = c;
}

2、出栈:栈的删除操作;
代码实现:

char StackPop (stack* s) {
    if(s->size == 0) {
            return 0;
    }    
    else {
           s->size--;       
           return s->arr[s->size];    
    }
}

队列:一种只允许在一端进行插入数据操作,在另一端进行删除操作的特殊线性表,进行插入操作的一端称为队尾,进行删除操作的一端称为队头
队列的示意图(循环队列为例):
在这里插入图片描述
循环队列代码实现(采用带头尾指针的顺序表实现):

typedef struct {
        int front;        
        int rear;        
        int* arr;        
        int k;
 } MyCircularQueue;

队列的主要操作:
1、入队:元素从队尾插入

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(((obj->rear+1)% (obj->k+1) ) == obj->front) {
            return false;   
     }    
     else {
             obj->arr[obj->rear] = value;
             if(obj->rear == obj->k) {
                         obj->rear = 0; 
             }        
             else {
                         obj->rear++;       
             }    
       }   
      return true;
}     

2、出队:元素从队头删除;

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(obj->front == obj->rear) {
            return false;   
     }    
     else {
             if(obj->front == obj->k) {
                     obj->front = 0;      
             }       
             else {
                      obj->front++;        
              }    
      }
      return  true;
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值