数据结构(栈和队列)
Posted tianliang-2000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(栈和队列)相关的知识,希望对你有一定的参考价值。
栈
定义:栈是一个先进后出的线性表,要求只在表尾进行删除和插入操作
注:对于栈来说,表尾成为栈的栈顶(top),相应的表头称为栈低(bottom)。
因为栈的本质是线性表,所以栈也分为顺序存储结构和链式存储结构;(一般用顺序存储实现)
栈的顺序存储:
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 #define initSize 10 5 #define sup 2 6 typedef int ElemType; 7 8 typedef struct{ 9 int stackSize;//栈当前可用最大容量 10 ElemType *base;//栈低 11 ElemType *top;//栈顶 12 }sqStack; 13 14 void initStack(sqStack *); 15 void Push(sqStack *,ElemType); 16 void pop(sqStack *,ElemType *); 17 18 void pop(sqStack *s,ElemType *val){ 19 if(s->base==s->top){ 20 return ; 21 } 22 *val=*(--s->top); 23 } 24 25 void Push(sqStack *s,ElemType val){ 26 if(s->top-s->base>=s->stackSize){//判断栈是否存满,并追加空间 27 s->base=(ElemType *)realloc(s->base,(s->stackSize+sup) * sizeof(ElemType)); 28 if(!s->base) 29 exit(0); 30 s->top=s->base+s->stackSize; 31 s->stackSize+=sup; 32 } 33 *(s->top)=val;//栈顶压栈数据 34 s->top++; 35 } 36 37 void initStack(sqStack *s){ 38 s->base=(ElemType *)malloc(initSize * sizeof(ElemType)); 39 if(!s->base) 40 exit(0); 41 s->top=s->base; 42 s->stackSize=initSize; 43 } 44 45 void main(){ 46 int val; 47 sqStack s; 48 initStack(&s); 49 printf("请输入压栈(-1退出):"); 50 scanf("%d",&val); 51 while(val != -1){ 52 Push(&s,val); 53 printf("请输入压栈(-1退出):"); 54 scanf("%d",&val); 55 } 56 printf("开始弹栈: "); 57 while(s.top!=s.base){ 58 pop(&s,&val); 59 printf("%d ",val); 60 } 61 }
后缀表达式
利用栈的方式:遍历中缀表达式;为数字压栈,为符号时弹栈;
方法:从左到右遍历中缀表达式,若为数字时直接输出;若为符号,则判断其与栈顶符号的优先级:是‘)’的话则栈中符号依次出栈,直到遇到‘(’【括号不会输出在后缀表达式中】;其他符号:如果该符号优先级小于等于栈顶优先级,则栈中符号依次弹栈输出,直到栈顶符号优先级小于带压栈符号优先级或者栈顶为‘(’;如果遍历结束,再将栈中符号依次出栈输出;
例如:5+2*(3*(3-1*2+1)) => 523312*-1+**+
后缀表达式的计算:1、按次序读取后缀表达式的每个字符。2、读取到操作数时,把操作数压入栈中。3、读取到操作符时,对栈顶的2个操作数做相应运算,要注意操作数的前后顺序。结果压入栈中。4、读取完所有字符后,弹出栈。得到的值就是所求结果。
队列
定义:只允许在一端进行插入操作,另一端进行删除操作的线性表
与栈相反,队列是一种先进后出的线性表。
队列既可以用链表实现,也可以用顺序存储实现,(一般用链表实现)
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 typedef int ElemType; 5 6 typedef struct QNode{ 7 ElemType data; 8 struct QNode *next; 9 }QNode,* QueuePrt; 10 11 typedef struct{ 12 QueuePrt head;//队头 13 QueuePrt rear;//队尾 14 }LinkQueue; 15 16 void init(LinkQueue *); 17 void Insedt(LinkQueue *,ElemType); 18 void pop(LinkQueue *,ElemType *); 19 20 void init(LinkQueue *q){ 21 q->head=q->rear=(QueuePrt)malloc(sizeof(QNode)); 22 if(!q->head) 23 exit(0); 24 q->head->next=NULL; 25 } 26 27 void Insedt(LinkQueue *q,ElemType e){ 28 QueuePrt p=(QueuePrt)malloc(sizeof(QNode)); 29 if(p==NULL) 30 exit(0); 31 p->data=e; 32 p->next=NULL; 33 q->rear->next=p;//用队尾链接 34 q->rear=p;//更新队尾 35 } 36 37 void pop(LinkQueue *q,ElemType *e){ 38 QueuePrt p=q->head->next;//得到队列中头结点指向的结点()队列中第一个值 39 q->head->next=p->next;//更新头结点指向的结点(在队列中删除原先第一个有值结点) 40 if(q->rear==p){//判断删除结点是否为队列中最后一个结点 41 q->rear=q->head;//队列将要成为空队列,将指向尾结点的指针指向头结点 42 } 43 *e=p->data; 44 free(p); 45 } 46 47 void main(){ 48 ElemType val; 49 LinkQueue s; 50 init(&s); 51 printf("%d ",s.head->data); 52 printf("请输入进入队列的数(-1退出):"); 53 scanf("%d",&val); 54 while(val != -1){ 55 Insedt(&s,val); 56 printf("请输入进入队列的数(-1退出):"); 57 scanf("%d",&val); 58 } 59 printf("开始出队列: "); 60 while(s.head!=s.rear){ 61 pop(&s,&val); 62 printf("%d ",val); 63 } 64 printf(" "); 65 }
以上是关于数据结构(栈和队列)的主要内容,如果未能解决你的问题,请参考以下文章