【学习日记01】栈+计网传输层
程序员文章站
2022-04-10 23:33:31
...
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)
进度有点慢,感觉有点累,但,欲戴皇冠,必承其重,既然想去名校,就要努力!
上一篇: 实操
推荐阅读