初识栈和队列

初识栈和队列

定义和特点:

栈和队列是两种常用的数据结构,并且是限定插入和删除只能在表的端点进行的线性表。

线性表:

Insert(L, i, x)
1 <= i <= n + 1
Delete(L, i)
1 <= i <= n

栈:先进后出,后进先出。

Insert(S, n+1, x)
Delete(S, n)

队列:先进先出,后进后出。

Insert(Q, b+1, x)
Delete(S, 1)

栈的定义和特点:

栈的相关概念:

1.栈是特殊的线性表,限定在一段进行插入和删除操作的线性表。(一般为表尾)又因其先进后出的特点:(Last In First Out)简称为LIFO结构。

2.表头(a1)称为栈底Base,表尾(an)称为栈顶(Top)。

PUSH(x):插入元素到栈顶(Top),称作入栈(压栈)。

POP (x):从栈顶(Top)删除最后一个元素,称作出栈(弹栈)。

微信截图_20240403152932

3.存储结构:顺序栈和链栈都可,但顺序栈较为常见。

数组模拟栈:
typedef struct stack{
    int data[MAXSIZE];
    int top;
}stack;
stack* Initstack(){									//初始化栈
    stack* s = (stack*)malloc(sizeof (stack));
    if(s==NULL){
        return NULL;
    }
    s->top = 0;
    return s;
}
void Pushstack(stack* s, int data){					//压栈,top上移
    s->data[s->top++] = data;
}
void Popstack(stack* s){							//弹栈,top下移
    s->top--;
}
int Gettop(stack* s){								//获取栈顶元素
    return s->data[s->top];
}
bool Emptystack(stack* s){							//判断栈是否为空
    if(s->top==0){
        return true;
    }
    return false;
}
bool Fullstack(stack* s){							//判断是否满栈
    if(s->top==MAXSIZE - 1){
        return true;
    }
    return false;
}
链栈:
typedef struct Node {
    int data;
    struct Node* next;
} Node;
void Initstack(Node* top){						//初始化栈	
    top = NULL;
}
bool Emptystack(Node* top){						//判断栈空
    if(top==NULL){
        return true;
    }else{
        return false;
    }
}
void Pushsatck(Node* top, int data){			//压栈
    Node* s = (Node*) malloc(sizeof (Node));
    s->data = data;
    s->next = top;
    top = s;
}
int Popstack(Node* top){						//出栈
    int data = top->data;
    Node* temp = top;
    top = top->next;
    free(temp);
}
int Gettop(Node* top){							//获取栈顶元素
    return top->data;
}
优缺点对比:

链表模拟栈的优点:

  1. 动态扩展:链表模拟栈可以根据需要动态地分配内存,不受固定大小的限制,可以灵活地扩展栈的大小。
  2. 插入和删除操作高效:由于链表的特性,插入和删除元素的操作时间复杂度为O(1),无需移动其他元素。
  3. 空间利用率高:链表模拟栈只使用实际需要的内存空间,不会浪费额外的空间。

链表模拟栈的缺点:

  1. 需要额外的指针空间:每个节点都需要一个指针来指向下一个节点,会占用额外的内存空间。
  2. 访问元素效率低:由于链表是通过指针连接的,访问元素需要遍历链表,时间复杂度为O(n)。

数组模拟栈的优点:

  1. 访问元素效率高:数组模拟栈可以通过索引直接访问元素,时间复杂度为O(1)。
  2. 空间利用率高:数组模拟栈只需要连续的内存空间即可。

数组模拟栈的缺点:

  1. 固定大小:数组模拟栈在创建时需要指定固定的大小,无法动态扩展,当栈满时需要重新分配更大的数组并复制元素。
  2. 插入和删除操作低效:由于数组是连续存储的,插入和删除元素的操作可能需要移动其他元素,时间复杂度为O(n)。

队列的定义和特点:

1.队列是特殊的线性表,在表一端进行插入(表尾),在另一端进行删除(表头),又因其先进先出的特点:(Frist In First Out)简称为FIFO结构。(头删尾插)

2.表头:(a1)称为队头,表尾(an)称为队尾。

​ 入队:插入元素到队尾。

​ 出队:从队头删除元素。

微信截图_20240403154539

3.存储结构:顺序队或链队均可,循环顺序队列较为常见。

后续内容正在补充,敬请期待。

头:(a1)称为队头,表尾(an)称为队尾。

​ 入队:插入元素到队尾。

​ 出队:从队头删除元素。

3.存储结构:顺序队或链队均可,循环顺序队列较为常见。

后续内容正在补充,敬请期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值