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内置函数之filter map reduce介绍
Nov 30 Python
Python中使用copy模块实现列表(list)拷贝
Apr 14 Python
python中list常用操作实例详解
Jun 03 Python
通过Python 接口使用OpenCV的方法
Apr 02 Python
Python遍历numpy数组的实例
Apr 04 Python
Python实现爬取马云的微博功能示例
Feb 16 Python
python调用matplotlib模块绘制柱状图
Oct 18 Python
python实现超市管理系统(后台管理)
Oct 25 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
使用Python+Appuim 清理微信的方法
Jan 26 Python
使用python实现学生信息管理系统
Feb 25 Python
pycharm无法安装cv2模块问题
May 20 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
重料打造自己的“宝马”---第三代
2021/03/02 无线电
Cannot modify header information错误解决方法
2008/10/08 PHP
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
js 操作符汇总
2014/11/08 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
Node.js获取前端ajax提交的request信息
2017/02/20 Javascript
JavaScript Uploadify文件上传实例
2017/02/28 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
详解js常用分割取字符串的方法
2019/05/15 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
set在python里的含义和用法
2019/06/24 Python
使用Python为中秋节绘制一块美味的月饼
2019/09/11 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
中队活动总结
2014/08/27 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
2014年稽查工作总结
2014/12/20 职场文书
小学教师岗位职责
2015/04/02 职场文书
黄河绝恋观后感
2015/06/08 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书