数据结构(C语言)代码实现(九)——迷宫探路表达式求值

目录

参考资料

迷宫探路

顺序栈头文件SqStack.h

顺序栈函数实现SqStack.cpp

迷宫探路主函数

表达式求值

链式顺序栈头文件LinkStack.h 

链式顺序栈函数实现LinkStack.cpp

表达式求值主函数

测试结果


参考资料

数据结构严蔚敏版

2021-9-22【数据结构/严蔚敏】【顺序栈&链式栈&迷宫求解&表达式求值】【代码实现算法3.1-3.5】_数据结构表达式求值代码严老师-CSDN博客

栈和队列-数据结构与算法(C语言版)_调用pop(&s,&e)函数,让队头数据出队,赋值给参数e,printf输出e-CSDN博客

迷宫探路

顺序栈头文件SqStack.h

#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码/*宏函数*/
//函数暂停一段时间
#define Wait(x)\{\double _Loop_Num_;\for(_Loop_Num_=0.01; _Loop_Num_<=100000.0*x; _Loop_Num_+=0.01)\;\}//设立一个空循环 typedef struct {int x;int y;
}PosType;//坐标位置
typedef struct {int ord;      //通道块在路径上的“序号”PosType seat; //通道块在迷宫中的“坐标位置”int di;       //从此通道块走向下一通道块的“方向”
}SElemType;//-----栈的顺序存储表示-----
#define STACK_INIT_SIZE 100  //存储空间初始分配量
#define STACKINCREMENT 10    //存储空间分配增量
typedef struct SqStack {SElemType* base;//在栈构造之前和销毁之后,base的值为NULLSElemType* top; //栈顶指针int stacksize;  //当前已分配的存储空间,以元素为单位
}SqStack;
//-----基本操作的函数原型说明-----
Status InitStack(SqStack& S);
//构造一个空栈S
Status DestroyStack(SqStack& S);
//销毁栈S,S不再存在
Status ClearStack(SqStack& S);
//把S置为空栈
Status StackEmpty(SqStack S);
//若栈S为空栈,则返回TRUE,否则返回FALSE
int StackLength(SqStack S);
//返回S的元素个数,即栈的长度
Status GetTop(SqStack S, SElemType& e);
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status Push(SqStack& S, SElemType e);
//插入元素e为新的栈顶元素
Status Pop(SqStack& S, SElemType& e);
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status StackTraverse(SqStack S, void(*visit)(SElemType));
//从栈顶到栈底依次对栈中每个元素调用函数visit()。一旦visit()失败,则操作失败

顺序栈函数实现SqStack.cpp

#include "SqStack.h"//-----基本操作的函数算法描述(部分)-----
Status InitStack(SqStack& S) {//构造一个空栈SS.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));if (!S.base)exit(OVERFLOW);//存储分配失败,警告C6011S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;
}Status DestroyStack(SqStack& S) {free(S.base);S.top = S.base = NULL;S.stacksize = 0;return OK;
}Status ClearStack(SqStack& S) {if (!S.base)return ERROR;S.top = S.base;return OK;
}Status StackEmpty(SqStack S) {if (S.base == S.top)return OK;return ERROR;
}int StackLength(SqStack s) {if (!s.base)return ERROR;return (int)(s.top - s.base);
}Status GetTop(SqStack s, SElemType& e) {//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif (s.base == s.top)return ERROR;e = *(s.top - 1);return OK;
}Status Push(SqStack& s, SElemType e) {//插入元素e为新的栈顶元素if (!s.base)return ERROR;if (s.top - s.base >= s.stacksize) {//栈满,追加存储空间s.base = (SElemType*)realloc(s.base, (s.stacksize + STACKINCREMENT) * sizeof(SElemType));if (!s.base)exit(_OVERFLOW);//存储分配失败s.top = s.base + s.stacksize;s.stacksize += STACKINCREMENT;}*s.top++ = e;//*s.top=e; s.top++;return OK;
}Status Pop(SqStack& s, SElemType& e) {//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif (!s.base || s.top == s.base) return ERROR;e = *--s.top;//--s.top; e=*s.top;return OK;
}Status StackTraverse(SqStack s, void (*visit)(SElemType)) {SElemType* p = s.base;if (!s.base)return ERROR;while (p < s.top)visit(*p++);printf("\n");return OK;
}

迷宫探路主函数

#include "SqStack.h"#define MAXSIZE 15
#define X 4
#define SleepTime 3
/* 迷宫类型定义 */
typedef enum {Wall,       // 外墙Obstacle,   // 迷宫内部障碍Way,        // 通路Impasse,    // 死胡同East, South, West, North //当前探索方向:东南西北
} CellType;typedef int MazeType[MAXSIZE][MAXSIZE];//用到的函数
SElemType Construct(int ord, PosType seat, int di);
//创建通道块信息并返回,序号、坐标位置和下一个访问方向
PosType NextPos(PosType seat, int di);
//获得下一个应当探索的位置
Status MazePath(MazeType maze, PosType start, PosType end);
//迷宫寻路主函数,第一个变量类型为int*,是地图的首地址。
void InitMaze(MazeType maze, PosType& start, PosType& end);
//初始化迷宫,start和end分别为迷宫的入口坐标和出口坐标
Status Pass(MazeType maze, PosType seat);
//判断当前位置是否为首次探索
void FootPrint(MazeType maze, PosType seat);
//留下初始访问足迹,初始访问足迹即向东访问
void MarkPrint(MazeType maze, PosType seat, int mark);
//留下标记+绘制迷宫
Status Equals(PosType a, PosType b);
//比较两个结构体
void PaintMaze(MazeType maze);
//绘制迷宫,以图形的方式呈现迷宫当前的状态Status MazePath(MazeType maze, PosType start, PosType end) {//若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中//(从栈底到栈顶),并返回TRUE;否则返回FALSESqStack S;       //存储探索过的通道块PosType curpos;  //当前位置SElemType e;     //当前通道块信息int curstep;     //当前通道块序号InitStack(S);curpos = start;//设定“当前位置”为“入口位置”curstep = 1;            //探索第一步do {if (Pass(maze, curpos)) {//当前位置可以通过,即是未曾走到过的通道块FootPrint(maze, curpos);//留下足迹e = Construct(curstep, curpos, East);Push(S, e);             //加入路径if (Equals(curpos, end) == TRUE) {printf("\n寻路成功\n\n");return TRUE;        //到达终点(出口)}curpos = NextPos(curpos, East);//下一位置是当前位置的东邻curstep++;              //探索下一步}else {//当前位置不能通过if (!StackEmpty(S)) {Pop(S, e);while (e.di == North && !StackEmpty(S)) {MarkPrint(maze, e.seat, Impasse);Pop(S, e);}if (e.di < North) {e.di++;MarkPrint(maze, e.seat, e.di);Push(S, e);curpos = NextPos(e.seat, e.di);//不需要curstep++,因为还是上次入栈的位置块}}}} while (!StackEmpty(S));printf("\n寻路失败!!\n\n");return FALSE;
}//初始化一个规模为N*N迷宫
//start和end分别为迷宫的入口坐标和出口坐标
//注:教材中无此操作,但该操作是必须存在的
void InitMaze(MazeType maze, PosType& start, PosType& end) {int i, j, tmp;srand((unsigned)time(NULL));//用系统时间做随机数种子for (i = 0;i < MAXSIZE;i++) {for (j = 0;j < MAXSIZE;j++) {//边缘部分设置围墙if (i == 0 || j == 0 || i == MAXSIZE - 1 || j == MAXSIZE - 1) {maze[i][j] = Wall;}else {//生成随机数[0,X-1]填充迷宫tmp = rand() % X;//1/X之一的概率生成障碍,否则生成通路块if (tmp == 0)maze[i][j] = Obstacle;elsemaze[i][j] = Way;}}}//迷宫内部设障完毕start.x = 1;start.y = 0;end.x = MAXSIZE - 2;end.y = MAXSIZE - 1;maze[1][0] = maze[MAXSIZE - 2][MAXSIZE - 1] = Way;//显示迷宫的初始状态PaintMaze(maze);
}Status Pass(MazeType maze, PosType seat) {int x = seat.x;int y = seat.y;if (x<0 || y<0 || x>MAXSIZE - 1 || y>MAXSIZE - 1)return FALSE;if (maze[x][y] != Way)return FALSE;return TRUE;
}PosType NextPos(PosType seat, int di) {PosType tmp = seat;switch (di) {case East:tmp.y++;//向东break;case South:tmp.x++;//向东break;case West:tmp.y--;//向东break;case North:tmp.x--;//向东break;}return tmp;
}void FootPrint(MazeType maze, PosType seat) {MarkPrint(maze, seat, East);
}void MarkPrint(MazeType maze, PosType seat, int mark) {maze[seat.x][seat.y] = mark;PaintMaze(maze);
}SElemType Construct(int ord, PosType seat, int di) {SElemType e;e.di = di;e.seat = seat;e.ord = ord;return e;
}Status Equals(PosType a, PosType b) {if (a.x == b.x && a.y == b.y)return TRUE;elsereturn FALSE;
}
/** 绘制迷宫* 以图形的方式呈现迷宫当前的状态**【注】* 教材中无此操作* 此处增加该操作的目的是观察寻路过程的每一步*/
void PaintMaze(MazeType maze) {int i, j;Wait(SleepTime);system("cls");                           //清空,下面是重新打印for (i = 0; i < MAXSIZE; i++) {for (j = 0; j < MAXSIZE; j++) {if (maze[i][j] == Wall) {                   // 外墙printf("▇");}else if (maze[i][j] == Obstacle) {        // 迷宫内部的障碍printf("X");}else if (maze[i][j] == East) {            // 正在朝东探索printf("→");}else if (maze[i][j] == South) {           // 正在朝南探索printf("↓");}else if (maze[i][j] == West) {            // 正在朝西探索printf("←");}else if (maze[i][j] == North) {           // 正在朝北探索printf("↑");}else if (maze[i][j] == Impasse) {         // 死胡同,即四个方向都探索过,但无法通过的位置printf("★");}else {                                   // 还未探索过的路径结点printf(" ");}if (j != 0 && j % (MAXSIZE - 1) == 0) {           // 每隔N个结点换行printf("\n");}}}printf("\n");
}int main(int argc, char* argv[]){MazeType maze;PosType start, end;char ch,Re = 'Y';while (Re == 'Y' || Re == 'y') {InitMaze(maze, start, end);    // 初始化迷宫,包括出入口MazePath(maze, start, end);      // 迷宫寻路printf("重置?(Y/N):");scanf_s("%c", &Re, 1);ch = getchar();printf("\n");}return 0;
}

表达式求值

链式顺序栈头文件LinkStack.h 

#pragma once
#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码
typedef char SElemType;//-----栈的顺序存储表示-----
#define STACK_INIT_SIZE 100  //存储空间初始分配量
#define STACKINCREMENT 10    //存储空间分配增量
typedef struct SNode {SElemType data;//数据域struct SNode* next;//
}SNode,*LinkStack;
//-----基本操作的函数原型说明-----
Status InitStack(LinkStack& S);
//构造一个空栈S
Status DestroyStack(LinkStack& S);
//销毁栈S,S不再存在
Status ClearStack(LinkStack& S);
//把S置为空栈
Status StackEmpty(LinkStack S);
//若栈S为空栈,则返回TRUE,否则返回FALSE
int StackLength(LinkStack S);
//返回S的元素个数,即栈的长度
Status GetTop(LinkStack S, SElemType& e);
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status Push(LinkStack& S, SElemType e);
//插入元素e为新的栈顶元素
Status Pop(LinkStack& S, SElemType& e);
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status StackTraverse(LinkStack S, void(*visit)(SElemType));
//从栈底到栈顶依次对栈中每个元素调用函数visit()。一旦visit()失败,则操作失败
Status StackTraverse_Top(LinkStack S, Status(*pfn_visit)(SElemType));
//从栈顶到栈底依次对栈中每个元素调用函数visit()。一旦visit()失败,则操作失败

链式顺序栈函数实现LinkStack.cpp

#include "LinkStack.h"Status InitStack(LinkStack& S) {S = (LinkStack)malloc(sizeof(SNode));if (!S)exit(OVERFLOW);S->next = NULL;return OK;
}Status DestroyStack(LinkStack& S) {LinkStack p = S->next, pp;while (p) {pp = p->next;free(p);p = pp;}free(S);return OK;
}Status ClearStack(LinkStack& S) {LinkStack p = S->next, pp;while (p) {pp = p->next;free(p);p = pp;}S->next = NULL;return OK;
}Status StackEmpty(LinkStack S) {if (S->next == NULL)return OK;elsereturn FALSE;
}int StackLength(LinkStack S) {int n = 0;LinkStack p = S->next;while (p) {n++;p = p->next;}return n;
}Status GetTop(LinkStack S, SElemType& e) {if (S->next == NULL)return ERROR;e = S->next->data;return OK;
}Status Push(LinkStack& S, SElemType e) {LinkStack p = (LinkStack)malloc(sizeof(SNode));p->data = e;p->next = S->next;S->next = p;return OK;
}Status Pop(LinkStack& S, SElemType& e) {if (S->next == NULL)return ERROR;e = S->next->data;LinkStack pp = S->next->next;free(S->next);S->next = pp;return OK;
}Status StackTraverse(LinkStack S, void(*visit)(SElemType)) {if (S->next == NULL) {printf("栈为空!\n");return ERROR;}for (int i = StackLength(S);i > 0;i--) {LinkStack p = S->next;int j = 1;while (p && j < i) {p = p->next;++j;}visit(p->data);}printf("\n");return OK;
}Status StackTraverse_Top(LinkStack S, Status(*pfn_visit)(SElemType)) {if (S->next == NULL) {printf("栈为空!\n");return ERROR;}LinkStack p = S->next;while (p) {pfn_visit(p->data);p = p->next;}printf("\n");return OK;
}

表达式求值主函数

#include "LinkStack.h"
#define OperandType charStatus visit(SElemType e) {printf(" %c", e);return OK;
}//-----算法部分-----
//判定运算符栈的(栈顶运算符Θ1)与(读入的运算符Θ2)之间的优先关系SElemType Precede(SElemType t1, SElemType t2) {SElemType t;switch (t1) {case '+':case '-':if (t2 == '*' || t2 == '/' || t2 == '(')t = '<';else t = '>';break;case '*':case '/':if (t2 == '(')t = '<';else t = '>';break;case '(':if (t2 == ')')t = '=';else if (t2 == '#')return ERROR;else t = '<';break;case ')':if (t2 == '(')return ERROR;else t = '>';break;case '#':if (t2 == ')')return ERROR;else if (t2 == '#')t = '=';else t = '<';break;}return t;
}//进行二元运算aΘb
SElemType Operator(SElemType a, SElemType theta, SElemType b) {SElemType ret;switch (theta){case '+':ret = (a - 48) + (b - 48) + 48;break;case '-':ret = (a - 48) - (b - 48) + 48;break;case '*':ret = (a - 48) * (b - 48) + 48;break;case '/':ret = (a - 48) / (b - 48) + 48;break;default:return NULL;}return ret;
}Status In(SElemType c) {switch (c) {case'+':case'-':case'*':case'/':case'(':case')':case'#':case'=':return OK;break;default:return ERROR;}
}//算法3.4
OperandType EvaluateExpression() {//算术表达式求值的算符优先算法。//设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。LinkStack OPTR;//运算符栈:寄存运算符LinkStack OPND;//运算数栈:寄存操作数或运算结果//VS中变量上加注释,当鼠标移到下一次同变量的地方会显示注释char c, x, theta, a, b, e;InitStack(OPTR);InitStack(OPND);Push(OPTR, '#');c = getchar();GetTop(OPTR, e);while (c != '#' || e != '#') {if (!In(c)) {//运算数Push(OPND, c);c = getchar();}else {//运算符GetTop(OPTR, e);switch (Precede(e, c)) {case '<'://栈顶元素优先权低Push(OPTR, c);c = getchar();break;case '='://脱括号并接受下一个字符Pop(OPTR, x);c = getchar();break;case '>'://退栈并将运算结果入栈Pop(OPTR, theta);Pop(OPND, b);Pop(OPND, a);Push(OPND, Operator(a, theta, b));break;}}GetTop(OPTR, e);}GetTop(OPND, e);return e;
}//运算数只能是一位自然数
int main(int argc, char** argv) {char c;c = EvaluateExpression();//3*5#=15printf("%d", c - 48);return 0;
}

测试结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

istio学习记录——VirtualService详解

上一篇使用VirtualService进行了简单的流量控制&#xff0c;并通过Gateway将流量导入到了集群内。这一篇将更加深入的介绍 VirtualService。 k8s中有service&#xff0c;service能够对流量进行负载均衡&#xff0c;那为什么istio又引入了VirtualService呢&#xff0c;因为serv…

wsl2挂载识别U盘中的内容

&#xff08;1&#xff09;wsl2中识别U盘&#xff0c;访问U盘 U盘插入电脑后&#xff0c;WSL并不会识别出U盘&#xff0c;如果想要在WSL中使用或查看U盘文件&#xff0c;需要挂载USB设备。 1、首先建一个文件夹用来挂载USB设备里文件的文件夹&#xff1a; sudo mkdir /mnt/e…

android stdio环境搭建

android stdio环境搭建 Jdk环境搭建 1. 准备Jdk,这边已经准备好了jdk1.8.0,该文件直接使用即可 2. 系统变量添加 %JAVA_HOME%\bin JAVA_HOME 3. 系统变量&#xff0c;Path路径添加 4. 添加完成后&#xff0c;输入命令javac / java -version&#xff0c;验证环境是否搭建…

贪心算法练习day2

删除字符 1.题目及要求 2.解题思路 1&#xff09;初始化最小字母为‘Z’&#xff0c;确保任何字母都能与之比较 2&#xff09;遍历单词&#xff0c;找到当前未删除字母中的最小字母 3&#xff09;获取当前位置的字母 current word.charAt(i)&#xff1b; 4&#xff09;删…

精品基于SpringBoot的体育馆场地预约赛事管理系统的设计与实现-选座

《[含文档PPT源码等]精品基于SpringBoot的体育馆管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#…

学习pybind11:Hello World例子

首先要明白pybind11是干啥的&#xff0c;对于一个C/C库&#xff0c;可以用pybind11封装它的接口为Python接口&#xff0c;这样得到一个python库&#xff0c;就可以把功能强大的库丢给使用python的boys & girls使用了~ 因此&#xff0c;使用pybind11做封装&#xff0c;是我…

代码随想录算法训练营第44天|● 完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

文章目录 ● 完全背包卡码网&#xff1a;52. 携带研究材料-完全背包理论练习代码&#xff1a; ● 518. 零钱兑换 II思路&#xff1a;五部曲 代码&#xff1a;滚动数组代码二&#xff1a;二维数组 ● 377. 组合总和 Ⅳ思路&#xff1a;五部曲 代码&#xff1a; ● 完全背包 卡码…

Bert-as-service 学习

pip3 install --user --upgrade tensorflow 安装遇到的问题如下&#xff1a; pip3 install --user --upgrade tensorflow 1052 pip uninstall protobuf 1053 pip3 uninstall protobuf 1054 pip3 install protobuf3.20.* 1055 pip3 install open-clip-torch2.8.2 1…

如何选择科技公司或者技术团队来开发软件项目呢

最近有客户问我们为什么同样软件项目不同公司报价和工期差异很大&#xff0c;我们给他解释好久才讲清楚&#xff0c;今天整理一下打算写一篇文章来总结一下&#xff0c;有需要开发朋友可以参考&#xff0c;我们下次遇到客户也可以直接转发文章给客户自己看。 我们根据我们自己报…

EMR StarRocks实战——Mysql数据实时同步到SR

文章摘抄阿里云EMR上的StarRocks实践&#xff1a;《基于实时计算Flink使用CTAS&CDAS功能同步MySQL数据至StarRocks》 前言 CTAS可以实现单表的结构和数据同步&#xff0c;CDAS可以实现整库同步或者同一库中的多表结构和数据同步。下文主要介绍如何使用Flink平台和E-MapRed…

jvm常用参数配置

一、 常用参数 -Xms JVM启动时申请的初始Heap值&#xff0c;默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时&#xff0c;JVM会减小heap的大小到-Xms指定的大小&#xff0c;可通过-XX:MaxHeapFreeRation来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同…

Java SpringBoot微服务面试题

Java SpringBoot微服务面试题 前言1、什么是 SpringBoot&#xff1f;2、什么是起步依赖&#xff1f;3、什么是自动配置&#xff1f;4、什么是命令行界面&#xff1f;5、什么是Actuator监控器&#xff1f;6、SpringBoot 的核心注解有哪些&#xff1f;7、什么是YAML&#xff1f;8…

Leetcoder Day26| 回溯part06:总结+三道hard题

332.重新安排行程 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…

[C++]使用C++部署yolov9的tensorrt模型进行目标检测

部署YOLOv9的TensorRT模型进行目标检测是一个涉及多个步骤的过程&#xff0c;主要包括准备环境、模型转换、编写代码和模型推理。 首先&#xff0c;确保你的开发环境已安装了NVIDIA的TensorRT。TensorRT是一个用于高效推理的SDK&#xff0c;它能对TensorFlow、PyTorch等框架训…

【寸铁的刷题笔记】图论、bfs、dfs

【寸铁的刷题笔记】图论、bfs、dfs 大家好 我是寸铁&#x1f44a; 金三银四&#xff0c;图论基础结合bfs、dfs是必考的知识点✨ 快跟着寸铁刷起来&#xff01;面试顺利上岸&#x1f44b; 喜欢的小伙伴可以点点关注 &#x1f49d; &#x1f31e;详见如下专栏&#x1f31e; &…

Java毕业设计-基于springboot开发的漫画之家系统-毕业论文+PPT(有源代码)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1.开发说明2.需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、后台模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的漫画之家系统-毕业论…

华为手动ipv6-to-ipv4隧道

中间r2的两个接口配置两个地址就行了&#xff0c;其它什么都不用配置 两边出接口R1和R3手动隧道建立&#xff1a;先把IPV4打通&#xff0c;并配置默认路由 再起隧道接口上进行配置&#xff0c;再配置带隧道的默认路由 PC上和上联接口网关只有IPV6地址 最终两个PC可以ping通 …

Python Web开发记录 Day4:JavaScript

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 四、JavaScript1、JavaScript-基础①JavaScript…

postman访问k8s api

第一种方式&#xff1a; kubectl -n kubesphere-system get sa kubesphere -oyaml apiVersion: v1 kind: ServiceAccount metadata:annotations:meta.helm.sh/release-name: ks-coremeta.helm.sh/release-namespace: kubesphere-systemcreationTimestamp: "2023-07-24T07…

Unity(第十部)时间函数和文件函数

时间函数 using System.Collections; using System.Collections.Generic; using UnityEngine;public class game : MonoBehaviour {// Start is called before the first frame updatefloat timer 0;void Start(){//游戏开始到现在所花的时间Debug.Log(Time.time);//时间缩放值…