2020.6.18
一、王道機試指南第三章-數據結構
1、棧:
- 簡單調用:使用C++
#include <stack>//head file
stack<int> S;//defien
S.empty();//empty?True:False;
S.push(i);
S.pop();
int i=S.top();
一個棧被多次調用時,一定要記得清空!!!
- 經典使用:
-
括號匹配:
思路:
· 順序遍歷字符串,遇到左括號就壓棧,遇到右括號就彈棧匹配(棧爲空就意味匹配失敗);
· 遍歷完後,棧中元素個數即爲未匹配成功的左括號個數;
· 若想標記哪些括號未匹配,可以將字符串內字符對應下標壓棧; -
表達式計算(典型思路):
-
相關練習題:表達式求值
借鑑別人的思路:
一個棧就可以。遇到and就彈出第一個和下一個判斷,下一個就不放入棧裏了。
然後遍歷棧 只要有true就輸出true(因爲這時候只有or了)
#include <stdio.h>
#include <stack>
#include <string>
#include <string.h>
#include <iostream>
using namespace std;
int main(){
stack<string> data;
char in[10];
string next;
int flag=0,ind=0,a,b;
while(scanf("%s",in)!=EOF){
ind++;
if((strcmp(in,"and")==0||strcmp(in,"or")==0)&&ind%2==1){
flag=1;break;
}//處理錯誤情況
if((strcmp(in,"true")==0||strcmp(in,"false")==0)&&ind%2==0){
flag=1;break;
}//處理錯誤情況
if(strcmp(in,"true")==0)
data.push("true");//值壓棧
else if(strcmp(in,"false")==0)
data.push("false");//值壓棧
else if(strcmp(in,"or")==0)
data.push("or");//or壓棧
else{//當遇到and時
scanf("%s",in);
ind++;//取下一個輸入
if((strcmp(in,"and")==0||strcmp(in,"or")==0)&&ind%2==1){
flag=1;break;
}//出錯情況判斷
next=data.top();data.pop();//取棧頂,出棧
//開始計算
if(strcmp(in,"true")==0)
b=1;
else
b=0;
if(next=="true")
a=1;
else
a=0;
if(a&&b)//結果壓棧
data.push("true");
else
data.push("false");
}
}
if(flag){
printf("error");
return 0;
}
else{
if(data.top()=="or"||data.top()=="and"){//以運算符結尾的錯誤情形
printf("error");
return 0;
}
while(!data.empty()){//遍歷棧中元素,是否有true
if(data.top()=="true"){
printf("true");
return 0;
}
data.pop();
}
}
printf("false");
return 0;
}
二、計網傳輸層
- udp傳輸協議(簡單的差錯控制,即校驗和)
- tcp傳輸協議:
1.0版:基於可靠信道,下面的版本基於不可靠信道
2.0版:引入:ack&nak + 重傳(ARQ協議)(停止-等待協議)
2.1版:引入:序列號seq(防止ack/nak被破壞)
2.2版:改進:去掉nak,在ack中加入序列號
2.3版:引入:定時器
現:引入流水線機制,即滑動窗口協議(回退N幀/GBN、選擇重傳/SR)
進度有點慢,感覺有點累,但,欲戴皇冠,必承其重,既然想去名校,就要努力!