調度算法
操作系統管理了系統的有限資源,當有多個進程(或多個進程發出的請求)要使用這些資源時,因爲資源的有限性,必須按照一定的原則選擇進程(請求)來佔用資源。這就是調度。目的是控制資源使用者的數量,選取資源使用者許可佔用資源或佔用資源。
在操作系統中調度是指一種資源分配,因而調度算法是指:根據系統的資源分配策略所規定的資源分配算法。對於不同的的系統和系統目標,通常採用不同的調度算法,例如,在批處理系統中,爲了照顧爲數衆多的段作業,應採用短作業優先的調度算法;又如在分時系統中,爲了保證系統具有合理的響應時間,應當採用輪轉法進行調度。目前存在的多種調度算法中,有的算法適用於作業調度,有的算法適用於進程調度;但也有些調度算法既可以用於作業調度,也可以用於進程調度。
目標闡述:
將中綴表達式轉換爲後綴表達式(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實現調度算法代碼詳解的全部內容,希望對大家有所幫助。