跳到主要内容数据结构:栈与队列的 5 种实现(顺序栈、链栈、顺序队、优先级队列) | 极客日志C算法
数据结构:栈与队列的 5 种实现(顺序栈、链栈、顺序队、优先级队列)
数据结构的五种实现方法:包括用于进制转换的顺序栈、模拟 FIFO 的尾插链栈、模拟 LIFO 的头插链栈、基础顺序队列以及基于链表和冒泡排序的优先级队列。文中提供了完整的 C 语言代码示例,涵盖入栈、出栈、入队、出队及排序等核心操作,适合数据结构初学者参考学习。
指针猎手2 浏览 1、顺序栈的设计
#include <stdio.h>
#define N 100
struct stack{
int top;
int data[N];
};
struct stack st={-1,{0}};
int isempty(){
if(st.top==-1){
return -1;
}else{
return 0;
}
}
void setempty(){
st.top=-1;
}
int push(int data){
if(st.top+1<N){
st.top+=1;
st.data[st.top]=data;
return 0;
}else{
return -1;
}
}
int pop(int *data){
if(isempty()==-1){
return -1;
}else{
*data=st.data[st.top];
st.top-=1;
return ;
}
}
{
(n){
TenToTwo(n/);
(,n%);
}
}
{
num=,i,res;
TenToTwo();
();
(num){
i=num%;
push(i);
num/=;
}
(isempty()!=){
pop(&res);
(,res);
}
;
}
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
0
void
TenToTwo
(int n)
if
2
printf
"%d"
2
int
main
()
int
100
100
printf
"\n"
while
2
2
while
-1
printf
"%d"
return
0
2、尾部添加式的链式栈的设计(先进先出)
#include <stdio.h>
#include <stdlib.h>
struct StackNode{
int id;
int data;
struct StackNode *pNext;
};
typedef struct StackNode Stn;
Stn *push(Stn *head,int id,int data){
Stn *pnew=(Stn *)malloc(sizeof(Stn));
Stn *p;
pnew->id=id;
pnew->data=data;
pnew->pNext=NULL;
if(head==NULL){
head=pnew;
}else{
p=head;
while(p->pNext){
p=p->pNext;
}
p->pNext=pnew;
}
return head;
}
Stn *pop(Stn *head,Stn *temp){
Stn *p=NULL;
if(head==NULL){
printf("不允许传入空指针\n ");
return NULL;
}else{
*temp=*head;
p=head;
head=head->pNext;
free(p);
return head;
}
}
void freeall(Stn *head){
Stn *p=head;
if(head==NULL){
return;
}else{
while(head->pNext){
head=head->pNext;
free(p);
p=head;
}
free(p);
}
}
int main(){
Stn *head=NULL;
Stn temp={0,0,NULL};
head=push(head,1,10);
head=push(head,2,20);
head=push(head,3,30);
head=push(head,4,40);
head=push(head,5,50);
head=push(head,6,60);
head=pop(head,&temp);
printf("id=%d,data=%d,pNext=%x\n",temp.id,temp.data,temp.pNext);
while(head){
head=pop(head,&temp);
printf("id=%d,data=%d,pNext=%x\n",temp.id,temp.data,temp.pNext);
}
return 0;
}
3、头部添加式的链式栈的设计(后进先出)
#include <stdio.h>
#include <stdlib.h>
struct StackNode{
int id;
int data;
struct StackNode *pNext;
};
typedef struct StackNode Stn;
Stn *push(Stn *head,int id,int data){
Stn *pnew=(Stn *)malloc(sizeof(Stn));
pnew->id=id;
pnew->data=data;
pnew->pNext=NULL;
if(head!=NULL){
pnew->pNext=head;
}
head=pnew;
return head;
}
Stn *pop(Stn *head,Stn *temp){
Stn *p=NULL;
if(head==NULL){
printf("不允许传入空指针\n ");
return NULL;
}else{
*temp=*head;
p=head;
head=head->pNext;
free(p);
return head;
}
}
void freeall(Stn *head){
Stn *p=head;
if(head==NULL){
return;
}else{
while(head->pNext){
head=head->pNext;
free(p);
p=head;
}
free(p);
}
}
int main(){
Stn *head=NULL;
Stn temp={0,0,NULL};
head=push(head,1,10);
head=push(head,2,20);
head=push(head,3,30);
head=push(head,4,40);
head=push(head,5,50);
head=push(head,6,60);
head=pop(head,&temp);
printf("id=%d,data=%d,pNext=%x\n",temp.id,temp.data,temp.pNext);
while(head){
head=pop(head,&temp);
printf("id=%d,data=%d,pNext=%x\n",temp.id,temp.data,temp.pNext);
}
return 0;
}
4、顺序队列的设计
#include <stdio.h>
#define N 100
struct queue{
char data[N];
int front;
int rear;
};
typedef struct queue QU;
void initQU(QU *sq){
sq->front=sq->rear=0;
}
int isempty(QU *sq){
if(sq->front==sq->rear){
return -1;
}else{
return 0;
}
}
char gethead(QU *sq){
if(sq->front==sq->rear)
return -1;
return sq->data[sq->front];
}
int inQU(QU *sq,char ch){
if(sq->rear+1<=N-2){
sq->data[sq->rear]=ch;
sq->rear++;
return 0;
}else{
return -1;
}
}
char outQU(QU *sq){
if(sq->front==sq->rear)
return -1;
sq->front++;
return sq->data[sq->front-1];
}
void showQU(QU *sq){
int i;
if(sq->front==sq->rear){
return;
}
for(i=sq->front;i<=sq->rear;i++){
printf("%c ",sq->data[i]);
}
printf("\n");
}
int main(){
char *pstr="ABCDEDGHIJKL";
char *p=pstr;
QU sq1={{0},0,0};
while(*p){
inQU(&sq1,*p);
showQU(&sq1);
p++;
}
while(isempty(&sq1)!=-1){
printf("%c ",outQU(&sq1));
}
return 0;
}
5、链表队列的设计
#include <stdio.h>
#include <stdlib.h>
#define N 100
struct queue{
int data;
int high;
struct queue *pNext;
};
typedef struct queue QU;
void sort(QU *head);
QU *InQU(QU *head,int data,int high){
QU *pt=NULL;
QU *pnew=(QU *)malloc(sizeof(QU));
pnew->data=data;
pnew->high=high;
pnew->pNext=NULL;
if(head==NULL){
head=pnew;
}else{
pt=head;
while(pt->pNext!=NULL){
pt=pt->pNext;
}
pt->pNext=pnew;
}
sort(head);
return head;
}
void showall(QU *head){
QU *p=head;
while(p!=NULL){
printf("data=%d,high=%d,head=%p,pNext=%p\n",p->data,p->high,head,p->pNext);
p=p->pNext;
}
}
QU *OutQU(QU *head,QU *temp){
if(head==NULL){
return NULL;
}else{
temp->data=head->data;
temp->high=head->high;
head=head->pNext;
return head;
}
}
void sort(QU *head){
QU *p1,*p2,temp;
if(head==NULL || head->pNext==NULL){
return;
}else{
for(p1=head;p1!=NULL;p1=p1->pNext){
for(p2=p1->pNext;p2!=NULL;p2=p2->pNext){
if(p1->high < p2->high){
temp.data=p1->data;temp.high=p1->high;
p1->data=p2->data;p1->high=p2->high;
p2->data=temp.data;p2->high=temp.high;
}
}
}
}
}
int main(){
QU *head=NULL;
QU temp={0,0,NULL};
head=InQU(head,10,1);
head=InQU(head,60,5);
head=InQU(head,90,2);
head=InQU(head,70,3);
head=InQU(head,30,0);
showall(head);
printf("\n");
while(head){
head=OutQU(head,&temp);
printf("出队的元素:data=%d,high=%d\n",temp.data,temp.high);
showall(head);
}
return 0;
}