Python实现调度算法代码详解


Posted in Python onDecember 01, 2017

调度算法

操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源。这就是调度。目的是控制资源使用者的数量,选取资源使用者许可占用资源或占用资源。

在操作系统中调度是指一种资源分配,因而调度算法是指:根据系统的资源分配策略所规定的资源分配算法。对于不同的的系统和系统目标,通常采用不同的调度算法,例如,在批处理系统中,为了照顾为数众多的段作业,应采用短作业优先的调度算法;又如在分时系统中,为了保证系统具有合理的响应时间,应当采用轮转法进行调度。目前存在的多种调度算法中,有的算法适用于作业调度,有的算法适用于进程调度;但也有些调度算法既可以用于作业调度,也可以用于进程调度。

目标阐述:

将中缀表达式转换为后缀表达式(Reverse Polish Notation:RPN 逆波兰式)
参与运算的数据的正则表示为:[0-9]{1,}形式的十进制数

运算符优先级:(从高到低)————————————————————————
( )   括号
/ * %  除乘余
+ -   加减————————————————————————

解:

第一步:使用正则词法分析器flex生成一个词法分析器,以处理输入的中缀表达式。
从stdin接收输入,检测非法字符,并将处理后的中缀表达式输出到stdout。

%option noyywrap
%{
#include<stdio.h>
#include<stdlib.h>%}

%%
[0-9]+ { printf("%s ",yytext); }
[()*/%+-] { printf("%s ",yytext); }
[[:space:]] {}
. { printf("\nError\n");exit(1); }
%%

int main()
{
 yylex();
 printf("\n");
 return 0;
}

第二步:使用Python进行转换。

从stdin接收一定格式的中缀表达式字符流,检测是否在词法分析器处理过程中出错,然后使用调度场算法处理数据,得到rpn列表。

import sys

line=sys.stdin.readline()
line2=sys.stdin.readline()

if len(line2)>0:
 sys.stderr.write("Syntax Error after : ")
 sys.stderr.write(line)
 sys.stderr.write("\n")
 exit(1)

lis=line.split(' ')
lis.pop()
lis_old=lis[:]
lis.reverse()

oplis=[]
rpnlis=[]
str=''
arith_op="+-*/%" # '(' ')' [0-9]+
prior={ '/':1,'*':1,'%':1, '+':2,'-':2 }

while len(lis)>0:
  str=lis.pop()
  if str=='(':
    oplis.append('(')
  elif str.isdigit():
    rpnlis.append(str)
  elif len(str)==1 and arith_op.find(str[0])!=-1:
    if len(oplis)==0 or oplis[len(oplis)-1]=='(':
      oplis.append(str)
    else:
      while len(oplis)>0 and oplis[len(oplis)-1]!='(' \
               and prior[oplis[len(oplis)-1]]<=prior[str]:
        rpnlis.append(oplis.pop())
      oplis.append(str)
  elif str==')':
    while len(oplis)>0 and oplis[len(oplis)-1]!='(':
      rpnlis.append(oplis.pop())
    if len(oplis)>0:
         oplis.pop()
        else:
         sys.stderr.write("Syntax Error while translating : Expected '('")
         sys.stderr.write("\n")
         exit(2)
    else:
     sys.stderr.write("Syntax Error : unkown notation -->")
     sys.stderr.write(str)
     sys.stderr.write("\n")
     exit(3)
while len(oplis)>0 :
  if oplis[len(oplis)-1]!='(':
     rpnlis.append(oplis.pop())
    else:
     sys.stderr.write("Syntax Error while translating : Unexpected '('")
     sys.stderr.write("\n")
     exit(1)

print lis_old
for i in lis_old:
  sys.stdout.write(i)
print ''
print rpnlis
for i in rpnlis:
  print i,
print ''

exit(0)

实验结果:

Python实现调度算法代码详解

目前程序的局限:
未进行语法检测。
不支持函数、变量标识。

附录:

Python实现调度算法代码详解

算法示意图,使用了3个空间。输入用符号代替,如果输入是一个数字则直接进输出队列,即图中 b),d),f),h)。如果输入是运算符,则压入操作符堆栈,即图中 c),e),但是,如果输入运算符的优先级低于或等于运算符栈顶的操作符优先级,则栈内元素进入输出队列(循环判定),输入操作符压入运算符堆栈,即图中 g)。 最后,运算符堆栈内元素入输出队列,算法结束。

Python实现调度算法代码详解

附录中资料摘自维基百科•调度场算法词条。

总结

以上就是本文关于Python实现调度算法代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出!

Python 相关文章推荐
Python isinstance判断对象类型
Sep 06 Python
Python内置函数Type()函数一个有趣的用法
Feb 18 Python
Python读写docx文件的方法
May 08 Python
python如何生成各种随机分布图
Aug 27 Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 Python
Python何时应该使用Lambda函数
Jul 02 Python
Python 日志logging模块用法简单示例
Oct 18 Python
Django REST框架创建一个简单的Api实例讲解
Nov 05 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
Sep 22 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
django rest framework serializer返回时间自动格式化方法
Mar 31 Python
Python进阶学习之特殊方法实例详析
Dec 01 #Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 #Python
浅谈python 里面的单下划线与双下划线的区别
Dec 01 #Python
vscode 远程调试python的方法
Dec 01 #Python
Python中单、双下划线的区别总结
Dec 01 #Python
从CentOS安装完成到生成词云python的实例
Dec 01 #Python
Django的分页器实例(paginator)
Dec 01 #Python
You might like
php中定时计划任务的实现原理
2013/01/08 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
JavaScript中的事件处理
2008/01/16 Javascript
JavaScript this 深入理解
2009/07/30 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
Python作用域用法实例详解
2016/03/15 Python
Python制作简易注册登录系统
2016/12/15 Python
Python变量和数据类型详解
2017/02/15 Python
python 获取图片分辨率的方法
2019/01/08 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
Python实现京东抢秒杀功能
2021/01/25 Python
Delphi CS笔试题
2014/01/04 面试题
市场开发与营销专业求职信
2013/12/31 职场文书
小区门卫值班制度
2014/01/24 职场文书
员工试用期考核自我鉴定
2014/04/13 职场文书
办理信用卡工作证明
2014/09/30 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
班主任开场白
2015/06/01 职场文书
vue实现拖拽交换位置
2022/04/07 Vue.js