初识栈和队列
定义和特点:
栈和队列是两种常用的数据结构,并且是限定插入和删除只能在表的端点进行的线性表。
线性表:
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)删除最后一个元素,称作出栈(弹栈)。
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;
}
优缺点对比:
链表模拟栈的优点:
- 动态扩展:链表模拟栈可以根据需要动态地分配内存,不受固定大小的限制,可以灵活地扩展栈的大小。
- 插入和删除操作高效:由于链表的特性,插入和删除元素的操作时间复杂度为O(1),无需移动其他元素。
- 空间利用率高:链表模拟栈只使用实际需要的内存空间,不会浪费额外的空间。
链表模拟栈的缺点:
- 需要额外的指针空间:每个节点都需要一个指针来指向下一个节点,会占用额外的内存空间。
- 访问元素效率低:由于链表是通过指针连接的,访问元素需要遍历链表,时间复杂度为O(n)。
数组模拟栈的优点:
- 访问元素效率高:数组模拟栈可以通过索引直接访问元素,时间复杂度为O(1)。
- 空间利用率高:数组模拟栈只需要连续的内存空间即可。
数组模拟栈的缺点:
- 固定大小:数组模拟栈在创建时需要指定固定的大小,无法动态扩展,当栈满时需要重新分配更大的数组并复制元素。
- 插入和删除操作低效:由于数组是连续存储的,插入和删除元素的操作可能需要移动其他元素,时间复杂度为O(n)。
队列的定义和特点:
1.队列是特殊的线性表,在表一端进行插入(表尾),在另一端进行删除(表头),又因其先进先出的特点:(Frist In First Out)简称为FIFO结构。(头删尾插)
2.表头:(a1)称为队头,表尾(an)称为队尾。
入队:插入元素到队尾。
出队:从队头删除元素。
3.存储结构:顺序队或链队均可,循环顺序队列较为常见。
后续内容正在补充,敬请期待。
头:(a1)称为队头,表尾(an)称为队尾。
入队:插入元素到队尾。
出队:从队头删除元素。
3.存储结构:顺序队或链队均可,循环顺序队列较为常见。
后续内容正在补充,敬请期待。