利用优先级队列实现堆栈

因为优先级队列是一种用来维护由一组元素构成的集合S的数据结构,执行的操作包含:

对于最大优先级队列:

insert(S,x)把元素x插入S,仍然保持最大优先级队列

maximum(S)取得最大关键字的值,也就是优先级最高的

extract_max(S):去的最大关键字的值并删除,剔除优先级最高的

increase_key(S,x,k):在第i的元素上换成K并保持S的性质,是此元素优先级提高

对于最小优先级队列性质正好相反:

通过minimun()和得到此队列中最小的元素,即优先级最小的元素。

通过extract_min()可得到优先级最小的元素,并将此元素从队列中删除。

通过insert()可一插入一个元素到此队列中,插入后此队列依旧是一个最小优先级队列。

通过decrease_key()可一将一个元素的优先级变小,并保持优先级队列的性质。

队列的实现:

因为队列的特点是先进先出(FIFO),可以用最小优先队列实现,设置插入元素的优先级属性就用基于最小堆的优先队列来实现,因为一个元素插入的越晚他的优先级就越低!所以可以用增量设置,因为在最小优先队列里元素值越大,优先级越低,这样子就可以实现队列一边插入,一边进入优先队列被设置成低的优先级;当出队的时候,extract_min()就可以把最先进入队列的元素出队了!

栈的实现:

栈的特点是后进先出,那用最小队列的话,进栈的时候,数据设置优先级属性,并且这个属性值递减的,因此优先级就是最大的,这样出队的时候就是把优先级队列最大的元素出队了。

实现的代码还得等待时间写出来!!嘎嘎!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include"stdio.h" char A[7]={'+','-','*','/','(',')','#'}; char B[7][7]={{'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','0'}, {'>','>','>','>','0','>','>'}, {'<','<','<','<','<','0','='}}; typedef struct stack1 { int top; int base; char s[20]; }stack1; typedef struct stack2 { int top; int base; int s[20]; }stack2; void Initstack1(stack1 *S) { S->top=S->base=0; } void Initstack2(stack2 *S) { S->top=S->base=0; } int push1(stack1 *S,char ch) { S->s[S->top]=ch; S->top++; } int push2(stack2 *S,int ch) { S->s[S->top]=ch; S->top++; } int search(char ch) { int i=0; while(ch!=A[i]) { i++; } return i; } char precede(char c1,char c2) { int i,j; i=search(c1); j=search(c2); return B[i][j]; } char gettop1(stack1 S) { char e; if(S.top==S.base) printf("!!!"); e=S.s[S.top-1]; return e; } int gettop2(stack2 S) { int e; if(S.top==S.base) printf("!!!"); e=S.s[S.top-1]; return e; } char pop1(stack1 *S) { if(S->top==S->base) return('!'); else { S->top--; return(S->s[S->top]); } } int pop2(stack2 *S) { if(S->top==S->base) return('!'); else { S->top--; return(S->s[S->top]); } } int operate(int a,char op,int b) { switch(op) { case '+':return(a+b);break; case '-':return(a-b);break; case '*':return(a*b);break; case '/':return(a/b);break; } } int main() { struct stack1 OPTR; struct stack2 OPND; char c,op; int a,b,an; Initstack1(&OPTR); push1(&OPTR,'#'); Initstack2(&OPND); c=getchar(); while(c!='#'||gettop1(OPTR)!='#') { if(c>='0'&&c<='9') { push2(&OPND,c-'0'); c=getchar(); do { if(c>='0'&&c<='9') push2(&OPND,pop2(&OPND)*10+(c-'0')); }while(c>='0'&&c<='9'); } else { switch(precede(gettop1(OPTR),c)) { case '<': push1(&OPTR,c);c=getchar();break; case '=': c=pop1(&OPTR);c=getchar();break; case '>': op=pop1(&OPTR);a=pop2(&OPND);b=pop2(&OPND); push2(&OPND,operate(b,op,a));break; }//switch } //else } //while an=pop2(&OPND); printf("\nyour answer is:\n=%d",an); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值