python核心編程:Python實現調度算法代碼詳解

調度算法

操作系統管理了系統的有限資源,當有多個進程(或多個進程發出的請求)要使用這些資源時,因爲資源的有限性,必須按照一定的原則選擇進程(請求)來佔用資源。這就是調度。目的是控制資源使用者的數量,選取資源使用者許可佔用資源或佔用資源。

在操作系統中調度是指一種資源分配,因而調度算法是指:根據系統的資源分配策略所規定的資源分配算法。對於不同的的系統和系統目標,通常採用不同的調度算法,例如,在批處理系統中,爲了照顧爲數衆多的段作業,應採用短作業優先的調度算法;又如在分時系統中,爲了保證系統具有合理的響應時間,應當採用輪轉法進行調度。目前存在的多種調度算法中,有的算法適用於作業調度,有的算法適用於進程調度;但也有些調度算法既可以用於作業調度,也可以用於進程調度。

目標闡述:
將中綴表達式轉換爲後綴表達式(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學習扣qun:913066266 ,看看前輩們是如何學習的!從基礎的python腳本到web開發、爬蟲、django、數據挖掘等【PDF,實戰源碼】,零基礎到項目實戰的資料都有整理。送給每一位python的小夥伴!每天都有大牛定時講解Python技術,分享一些學習的方法和需要注意的小細節,點擊加入我們的 python學習者聚集地

目前程序的侷限:
未進行語法檢測。
不支持函數、變量標識。

附錄:在這裏插入圖片描述
算法示意圖,使用了3個空間。輸入用符號代替,如果輸入是一個數字則直接進輸出隊列,即圖中 b),d),f),h)。如果輸入是運算符,則壓入操作符堆棧,即圖中 c),e),但是,如果輸入運算符的優先級低於或等於運算符棧頂的操作符優先級,則棧內元素進入輸出隊列(循環判定),輸入操作符壓入運算符堆棧,即圖中 g)。 最後,運算符堆棧內元素入輸出隊列,算法結束。在這裏插入圖片描述
附錄中資料摘自維基百科•調度場算法詞條。

總結

以上就是本文關於Python實現調度算法代碼詳解的全部內容,希望對大家有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章