数据结构 C/C++(实验二:栈)

(大家好,今天分享的是数据结构的相关知识,大家可以在评论区进行互动答疑哦~加油!💕)

目录

提要:实验题目

一、实验目的 

二、实验内容及要求

三、算法思想 

实验1

实验2

四、源程序及注释

实验1代码(顺序存储结构)

实验2代码(链式存储结构)

五、实验结果

实验1结果

实验2结果  


提要:实验题目

1. 栈顺序存储结构下基本操作的实现    

2. 栈链式存储结构下基本操作的实现   


一、实验目的 

1.掌握栈的顺序存储表示和链式存储表示。

2.掌握顺序栈和链栈的基本操作算法的实现。

3.了解栈的两种不同存储结构的特点,会灵活运用栈解决某些实际问题。


二、实验内容及要求

1. 栈的基本操作的实现(初始化、进栈、出栈、取栈顶元素、判断栈是否为空、遍历等),要求分别采用顺序链式存储结构。

2. 写一个程序,将输入的十进制数据转换为八进制数据。在此基础上修改程序,实现十进制数据向N (2或8或16)进制的转换。 

3. 算术表达式求值。以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用教材中表3.1给出的算符优先关系,实现对算术四则混合运算表达式的求值。

【测试数据】

3*(7-1);1+2+3+4;88-1*5;(20+2)*(6/2);6+2*(3+6)。

注:前两个题目必做,第3题选做。


算法思想 

实验1

顺序存储结构栈的基本操作算法

(1)初始化

算法:分配一个预定大小的数组作为栈的存储空间,并初始化栈顶指针为-1(表示空栈)。

(2)进栈(Push)

算法:检查栈是否已满,若未满,则将新元素添加到栈顶,并更新栈顶指针。

(3)出栈(Pop)

算法:检查栈是否为空,若不为空,则移除栈顶元素,并更新栈顶指针。

(4)取栈顶元素(Top)

算法:检查栈是否为空,若不为空,则返回栈顶元素的值但不删除它。

(5)判断栈是否为空(IsEmpty)

算法:检查栈顶指针是否为-1。

(6)遍历

算法:从栈底到栈顶依次访问栈中的每个元素。这通常通过循环或递归实现,但在顺序栈中,由于元素是连续存储的,所以可以直接通过索引访问。

(7)十进制数据转换为八进制数据的算法

(利用栈的后进先出特性)

将十进制数除以8,记录余数。

将商作为新的十进制数,重复步骤1,直到商为0。

将记录的余数按逆序排列,即为八进制数。

在实现过程中,可以使用栈来存储每次除法的余数,这样最后出栈的顺序就是逆序的余数,即八进制数。

(8)算术表达式求值的算法

(利用栈的后进先出特性和运算符优先级)

将算术表达式转换为逆波兰表达式(后缀表达式)。

使用两个栈,一个用于存储操作数,另一个用于存储运算符。

遍历逆波兰表达式,对于每个元素:

如果是操作数,则将其压入操作数栈。

如果是运算符,则从操作数栈中弹出两个操作数,根据运算符进行计算,并将结果压回操作数栈。

遍历结束后,操作数栈中应只剩下一个元素,即为表达式的值。

在实现过程中,需要注意运算符的优先级和括号的处理。这通常通过定义运算符的优先级和括号的特殊处理规则来实现。

实验2

对于链式存储结构栈的基本操作及其相关算法,由于其实现方式与顺序存储结构有所不同(使用链表而非数组来存储栈元素),但基本操作的逻辑和算法思想是相似的。主要区别在于链表需要动态分配和释放内存,以及通过指针来访问栈顶元素和下一个元素。


四、源程序及注释

实验1代码顺序存储结构)

#include<iostream>   //输入输出流头文件 
#include<fstream>    //文件操作头文件 
#include<string>     //字符串操作头文件 
#include<iomanip>   //输入输出操纵运算头文件 
#include<stack>  // 引入 STL stack 进行栈操作
#include<cctype> // 引入字符处理函数
using namespace std;//调用命名空间std中所有标识符

//预定义常量及预定义类型
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef	char SElemType;

//表示部分:
typedef struct {
	SElemType *base;
	SElemType *top;
	int stacksize;
} SqStack;


//实现部分:
//1.初始化
Status InitStack(SqStack &S) {
//构造一个空的顺序栈S
	S.base=new SElemType[MAXSIZE]; //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
	if(!S.base)
		exit(OVERFLOW);//存储分配失败
	S.top=S.base; //top初始为base空栈
	S.stacksize=MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
	return OK;
}

//2.顺序栈的入栈
Status Push(SqStack &S, SElemType e) {
	//插入元素e为新的栈顶元素
	if(S.top-S.base==S.stacksize) return ERROR;//栈满
	*S.top++=e; //将元素e压入栈顶,栈顶指针加一
	return OK;
}

//3.顺序栈的出栈
Status Pop(SqStack &S, SElemType &e) {
	//删除S的栈顶元素,用e返回其值
	if(S.top==S.base) return ERROR;//栈空
	e=*--S.top; //栈顶指针减一,将栈顶元素赋给e
	return OK;
}

//4.取栈顶元素
Status Top(SqStack S,SElemType &e) {
	//返回S的栈顶元素,不修改栈顶指针
	if (S.top != S.base) { // 非空
		e = *(S.top - 1); // 返回栈顶元素,栈顶指针不变
		return OK;
	}
	return ERROR; // 栈空
}

//5.判空
Status StackEmpty(SqStack S) {
	if(S.top==S.base) return OK;
	else return ERROR;
}

//6.判满
Status FullEmpty(SqStack S) {
	if(S.top-S.base==S.stacksize) return OK;
	else return ERROR;
}

//7.遍历
void printStack(SqStack S) {
	printf("栈内元素为:");
	SElemType *p=S.base;
	while(p!=S.top) {
		printf("%c",*p);
		p++;
	}
	printf("\n");
}

//8. 求长
Status StackLength(SqStack S) {
	return S.top-S.base;
}

//9. 清空
Status ClearStack(SqStack &S) {
	S.top=S.base;
	return OK;
}

//10. 销毁
Status DestoryStack(SqStack &S) {
	if(S.base) {
		delete S.base;
		S.stacksize=0;
		S.top=S.base=NULL;
	}
	return OK;
}

//11.数制转换
void conversion(int N) {
	SqStack S;
	InitStack(S);
	char e;
	while(N) {
		Push(S,N%8);
		N=N/8;
	}
	while(!StackEmpty(S)) {
		Pop(S,e);
		printf("%d",e);
	}
}

//12.括号匹配
Status Matching() {
	SqStack S;
	InitStack(S);
	SElemType ch, x,e;
	Status flag = 1;
	printf("请输入需要匹配的括号(以#结束):\n");
	scanf("%c", &ch);
	while (ch != '#' && flag) {
		switch (ch) {
			case '(':
			case '[':
				Push(S, ch);
				break;
			case ')':
				if (!StackEmpty(S) && Top(S,e) == '(') {
					Pop(S, x);
				} else {
					flag = 0;
				}
				break;
			case ']':
				if (!StackEmpty(S) && Top(S,e) == '[') {
					Pop(S, x);
				} else {
					flag = 0;
				}
				break;
		}
		//ch = getche();
		scanf("%c", &ch);
	}
	if (StackEmpty(S) && flag) {
		return true;
	} else {
		return false;
	}
}

// 13. 算术表达式求值
// 计算两个数的运算
int applyOp(int a, int b, char op) {
    switch (op) {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': 
            if (b == 0) {
                cout << "Error: Division by zero!" << endl;
                exit(ERROR);
            }
            return a / b;
    }
    return 0;
}

// 获取运算符优先级
int precedence(char op) {
    if (op == '+' || op == '-') return 1;
    if (op == '*' || op == '/') return 2;
    return 0;
}

// 算术表达式求值
int evaluateExpression(const string &expression) {
    stack<int> values; // 存储数字
    stack<char> ops;   // 存储运算符

    for (int i = 0; i < expression.length(); i++) {
        // 当前字符是空格,跳过
        if (isspace(expression[i])) continue;

        // 当前字符是数字
        if (isdigit(expression[i])) {
            int val = 0;
            while (i < expression.length() && isdigit(expression[i])) {
                val = (val * 10) + (expression[i] - '0');
                i++;
            }
            values.push(val);
            i--; // 调整i,避免跳过下一个字符
        } 
        // 当前字符是运算符
        else if (expression[i] == '+' || expression[i] == '-' || 
                 expression[i] == '*' || expression[i] == '/') {
            while (!ops.empty() && precedence(ops.top()) >= precedence(expression[i])) {
                int b = values.top(); values.pop();
                int a = values.top(); values.pop();
                char op = ops.top(); ops.pop();
                values.push(applyOp(a, b, op));
            }
            ops.push(expression[i]);
        }
    }

    // 处理剩余的运算符
    while (!ops.empty()) {
        int b = values.top(); values.pop();
        int a = values.top(); values.pop();
        char op = ops.top(); ops.pop();
        values.push(applyOp(a, b, op));
    }

    return values.top();
}

void calculateExpression() {
    string expression;
    cout << "请输入一个算术表达式(不含变量,支持 + - * /):";
    cin.ignore(); // 清除输入缓冲区
    getline(cin, expression); // 读取整行
    int result = evaluateExpression(expression);
    cout << "表达式的值为:" << result << endl;
}
void showMenu() {
	cout << "****************************\n";
	cout << "****      1. 初始化     ****\n";
	cout << "****      2. 入栈       ****\n";
	cout << "****      3. 出栈       ****\n";
	cout << "****      4. 取栈顶元素 ****\n";
	cout << "****      5. 判空       ****\n";
	cout << "****      6. 判满       ****\n";
	cout << "****      7. 遍历       ****\n";
	cout << "****      8. 求长       ****\n";
	cout << "****      9. 清空       ****\n";
	cout << "****      10. 销毁      ****\n";
	cout << "****      11. 数制转换  ****\n";
	cout << "****      12. 括号匹配  ****\n";
	cout << "****      13. 表达式求值****\n";
	cout << "****      0. 退出       ****\n";
	cout << "****************************\n";
}


int main() {
	SqStack S;
	char e,i;
	int N,choose= -1;
	showMenu();
	while (choose != 0) {
		cout << "Please select(0-13):";
		cin >> choose;
		switch (choose) {
			case 1://初始化
				InitStack(S);
				cout << "Init successfully:\n";
				break;

			case 2: //入栈
				cout << "Please input the elem in English :";
				cin >> e;
				Push(S,e);
				break;

			case 3://出栈
				Pop(S,e);
				cout << "出栈元素为"<<e<<endl;
				break;

			case 4: //取栈顶元素
				Top(S,i);
				cout << "栈顶元素为"<<i<<endl;	
        		break;
        		
			case 5: //判空
				cout << (StackEmpty(S) == OK ? "栈为空" : "栈不为空") << endl;
				break;

			case 6: //判满
				cout << (FullEmpty(S) == OK ? "栈满" : "栈不满") << endl;
				break;

			case 7: //遍历
				printStack(S);
				break;

			case 8: //求长
				cout << "栈的长度: " << StackLength(S) << endl;
				break;

			case 9: //清空
				ClearStack(S);
				cout << "栈已清空" << endl;
				break;

			case 10: //销毁
				DestoryStack(S);
				cout << "栈已销毁" << endl;
				break;

			case 11: //数制转换
				cout << "Please input the Number (10进制) :";
				cin >> N;
                cout << "10进制数字转换为8进制后数字为:";
                conversion(N);
                cout << endl;
				break;

			case 12: //括号匹配
				if (Matching() == OK) {
                    cout << "括号匹配成功!" << endl;
                } else {
                    cout << "括号匹配失败!" << endl;
                }
                break;
                
            case 13: // 算术表达式求值
                calculateExpression();
                break;
		}
	}
	return 0;
}

实验2代码链式存储结构)

#include<iostream>   //输入输出流头文件 
#include<fstream>    //文件操作头文件 
#include<string>     //字符串操作头文件 
#include<iomanip>   //输入输出操纵运算头文件 
#include <stack>
using namespace std;//调用命名空间std中所有标识符

//预定义常量及预定义类型
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef	char SElemType;

//表示部分:
typedef struct StackNode{
	SElemType data;
	struct StackNode *next;
} StackNode,*LinkStack;


//实现部分:
//1.初始化
Status InitStack(LinkStack &S) {
//构造一个空的链栈S
	S=NULL;
	return OK;
}

//2.链栈的入栈
Status Push(LinkStack &S, SElemType e) {
	//插入元素e为新的栈顶元素
	StackNode *p=new StackNode;
	if(!p) exit(OVERFLOW);
	p->data=e;
	p->next=S;//将新节点插入栈顶
	S=p;//修改栈顶指针为p
	return OK;
}

//3.链栈的出栈
Status Pop(LinkStack &S, SElemType &e) {
	//删除S的栈顶元素,用e返回其值
	if(S==NULL) return ERROR;//栈空
	e=S->data;; //将栈顶元素赋给e
	LinkStack p=S;//用p临时保存栈顶元素空间,以备释放
	S=S->next;//修改栈顶指针
	delete p;
	return OK;
}

// 4.取栈顶元素
Status Top(LinkStack S, SElemType &e) { // 通过引用返回栈顶元素
    // 返回S的栈顶元素,不修改栈顶指针
    if (S != NULL) {
        e = S->data; // 将栈顶元素赋值给e
        return OK;
    }
    return ERROR; // 栈空
}


//5.判空
Status StackEmpty(LinkStack S) {
	if(S==NULL) return OK;
	else return ERROR;
}


//6.遍历
void StackTraverse(LinkStack S) {
	LinkStack p;//使指针p辅助访问栈内元素
	p=S;
	printf("栈内元素为:");
	while(p!=NULL) {
		printf("%c",p->data);
		p=p->next;
	}
	printf("\n");
}

//7. 求长
Status StackLength(LinkStack S) {
	int len=0;
	while(S!=NULL){
		len++;
		S=S->next;
	}
	return len;
}

//8. 清空
Status ClearStack(LinkStack &S) {
	StackNode *p;
	while(S!=NULL){
		p=S->next;
		delete S;
		S=p;
	}
	return OK;
}

//9. 销毁
Status DestroyStack(LinkStack &S) {
    StackNode *p;
    while (S) {
        p = S;
        S = S->next;
        delete p;
    }
    S = NULL;
    return OK;
}


//10.数制转换
void conversion(int N) {
    LinkStack S;
    InitStack(S);
    char e;
    while (N) {
        Push(S, '0' + (N % 8)); // 将数字转换为字符
        N = N / 8;
    }
    while (!StackEmpty(S)) {
        Pop(S, e);
        cout << e; // 输出转换的数字
    }
    cout << endl;
}

//11.括号匹配
Status Matching() {
    LinkStack S;
    InitStack(S);
    SElemType ch, e;
    Status flag = OK;
    cout << "请输入需要匹配的括号(以#结束):\n";
    cin >> ch;
    while (ch != '#' && flag == OK) {
        switch (ch) {
            case '(':
            case '[':
                Push(S, ch);
                break;
            case ')':
                if (!StackEmpty(S) && Top(S, e) == OK && e == '(') {
                    Pop(S, e);
                } else {
                    flag = ERROR;
                }
                break;
            case ']':
                if (!StackEmpty(S) && Top(S, e) == OK && e == '[') {
                    Pop(S, e);
                } else {
                    flag = ERROR;
                }
                break;
        }
        cin >> ch;
    }
    return (StackEmpty(S) && flag == OK) ? OK : ERROR;
}

// 12.算术表达式求值
// 定义优先级
int precedence(char op) {
    if (op == '+' || op == '-') return 1;
    if (op == '*' || op == '/') return 2;
    return 0;
}

// 进行简单的运算
int applyOp(int a, int b, char op) {
    switch (op) {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': 
            if (b != 0) return a / b;
            else {
                cout << "Error: Division by zero!" << endl;
                exit(1);
            }
    }
    return 0;
}

int evaluateExpression(const string &expr) {
    stack<int> values; // 存储操作数
    stack<char> ops;   // 存储操作符

    for (int i = 0; i < expr.length(); i++) {
        // 当前字符是空格则跳过
        if (isspace(expr[i])) continue;

        // 当前字符是数字
        if (isdigit(expr[i])) {
            int val = 0;
            while (i < expr.length() && isdigit(expr[i])) {
                val = val * 10 + (expr[i] - '0');
                i++;
            }
            values.push(val);
            i--; // 因为外面的 for 循环还会自增
        }
        // 当前字符是操作符
        else {
            while (!ops.empty() && precedence(ops.top()) >= precedence(expr[i])) {
                int val2 = values.top(); values.pop();
                int val1 = values.top(); values.pop();
                char op = ops.top(); ops.pop();
                values.push(applyOp(val1, val2, op));
            }
            ops.push(expr[i]);
        }
    }

    // 处理剩余操作符
    while (!ops.empty()) {
        int val2 = values.top(); values.pop();
        int val1 = values.top(); values.pop();
        char op = ops.top(); ops.pop();
        values.push(applyOp(val1, val2, op));
    }

    return values.top();
}

void showMenu() {
	cout << "****************************\n";
	cout << "****      1. 初始化     ****\n";
	cout << "****      2. 入栈       ****\n";
	cout << "****      3. 出栈       ****\n";
	cout << "****      4. 取栈顶元素 ****\n";
	cout << "****      5. 判空       ****\n";
	cout << "****      6. 遍历       ****\n";
	cout << "****      7. 求长       ****\n";
	cout << "****      8. 清空       ****\n";
	cout << "****      9. 销毁       ****\n";
	cout << "****      10. 数制转换  ****\n";
	cout << "****      11. 括号匹配  ****\n";
	cout << "****      12. 表达式求值****\n"; 
	cout << "****      0. 退出       ****\n";
	cout << "****************************\n";
}


int main() {
	LinkStack S;
	string expression;
	char e,i;
	int N,choose= -1;
	showMenu();
	while (choose != 0) {
		cout << "Please select(0-12):";
		cin >> choose;
		switch (choose) {
			case 1://初始化
				InitStack(S);
				cout << "Init successfully:\n";
				break;

			case 2: //入栈
				cout << "Please input the elem:";
				cin >> e;
				Push(S,e);
				break;

			case 3://出栈
				Pop(S,e);
				cout << "出栈元素为"<<e<<endl;
				break;

        	case 4: //取栈顶元素
    			if (Top(S, i) == OK) { // 检查返回值
		        cout << "栈顶元素为 " << i << endl;
			    } else {
		        cout << "栈为空,无法获取栈顶元素。" << endl;
			    }
			    break;

			case 5: //判空
				cout << (StackEmpty(S) == OK ? "栈为空" : "栈不为空") << endl;
				break;

			case 6: //遍历
				StackTraverse(S);
				break;

			case 7: //求长
				cout << "栈的长度: " << StackLength(S) << endl;
				break;

			case 8: //清空
				ClearStack(S);
				cout << "栈已清空" << endl;
				break;

			case 9: //销毁
				DestroyStack(S);
				cout << "栈已销毁" << endl;
				break;

			case 10: //数制转换
				cout << "Please input the Number (10进制) :";
				cin >> N;
                cout << "10进制数字转换为8进制后数字为:";
                conversion(N);
                cout << endl;
				break;

			case 11: //括号匹配
			if (Matching() == OK) {
                    cout << "括号匹配成功!" << endl;
                } else {
                    cout << "括号匹配失败!" << endl;
                }
                break;
                
            case 12: // 表达式求值
                cout << "请输入算术表达式(不含空格): ";
                cin >> expression;
                cout << "表达式 " << expression << " 的值为: " << evaluateExpression(expression) << endl;
                break;
        }
    }
	return 0;
}


五、实验结果

实验1结果

实验2结果  


(今日分享暂时到此为止啦!为不断努力的自己鼓鼓掌吧🥳。今日文案分享:以如常为喜,以如愿为安。)    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考背诵笔记

计算机硬件组成 运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入设备&#xff0c;输出设备 中央处理单元&#xff08;CPU&#xff09; 控制器组成 指令寄存器&#xff08;IR&#xff09;:暂存cpu执行指令 程序计数器&#xff08;PC&#xff09;:存放下一条执…

面试问答-1

目录 1、线程和进程的概念&#xff0c;区别、以及什么时候用线程什么时候用进程 1.1 概念 1.2 区别 1.3 选择 2、TCP/IP分几层&#xff0c;每层的核心任务是什么 1.tcp/ip模型 tcp&#xff1a; udp&#xff1a; tcp、udp的区别 tcp/udp的连接过程&#xff1a; 3、htt…

矩阵特殊打印方式

小伙伴们大家好&#xff0c;好几天没更新了&#xff0c;主要有个比赛。从今天起继续给大家更新&#xff0c;今天给大家带来一种新的题型&#xff1a;矩阵特殊打印方式。 螺旋打印矩阵 解题思路 首先给大家看一下什么是螺旋方式打印&#xff1a; 就像这样一直转圈圈。 我想大多…

Docker篇(Docker安装)

目录 一、Centos7.x 1. yum 包更新到最新 2. 安装需要的软件包 3. 设置 yum 源为阿里云 4. 安装docker 5. 安装后查看docker版本 6. 设置ustc镜像源 二、CentOS安装Docker 前言 1. 卸载&#xff08;可选&#xff09; 2. 安装docker 3. 启动docker 4. 配置镜像加速 …

计算机网络——路由器构成

算路由表是分布式去算——你算你的&#xff0c;我算我的 输出队列非先来先传 调度发生在哪里 缓存队列一般是应对——来数据方向的速度过快问题

C# 实现读取Excel文件并设置单元格计算公式再保存

背景&#xff1a;需求需要读取数据导出成Excel文件&#xff0c;并且其中有一列需要赋值为公式&#xff0c;用于用户自己修改数据自动计算 导出Excel&#xff0c;我用到开源包MiniExcel Gitee地址MiniExcel源码介绍&#xff0c;功能说明 Nuget安装 搜索MiniExcel 导出代码如下&a…

基于matlab的SVPWM逆变器死区补偿算法仿真研究

背景介绍&#xff1a; 三相脉宽调制(pulse width modulation&#xff0c;PWM)电压源逆变器(voltage source inverter&#xff0c;VSI)的死区效应可导致电机相电压和相电流畸变、零电流钳位效应以及转矩和转速脉动&#xff0c;系统性能降低。为提高系统运行性能&#xff0c;对V…

Spring Validation数据校检

文章目录 Spring Validation1 关于Spring Validation2 使用流程3 快速入门4 运行异常处理4.1 说明4.2 处理异常4.3 明确提示消息 5 常用注解5.1 NotNull注解5.2 NotEmpty 注解5.3 NotBlank 注解5.4 Size 注解5.5 Range 注解 6 非POJO参数校验6.1 使用流程6.2 使用示例 Spring V…

2024数据库国测揭晓:安全与可靠的新标准,你了解多少?

2024年数据库国测的结果&#xff0c;于9月份的最后一天发布了。 对于数据库行业的从业者来说&#xff0c;国测是我们绕不过去的坎儿。那么什么是国测&#xff1f;为什么要通过国测&#xff0c;以及国测的要求有哪些&#xff1f; 这篇文章带大家一探究竟。 国测 自愿平等、客…

前端入门一之CSS知识详解

前言 CSS是前端三件套之一&#xff0c;在MarkDown中也完美兼容这些语法&#xff1b;这篇文章是本人大一学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 文章目录 Emmet语法&#xff1a;CSS基本语法&#xff1a;css语法结构只有3种&#xff1a…

虚拟现实和增强现实技术,如何打造沉浸式体验?

内容概要 在这个科技飞速发展的时代&#xff0c;虚拟现实&#xff08;VR&#xff09;与增强现实&#xff08;AR&#xff09;技术的结合就像调皮的小精灵&#xff0c;一下子把我们的生活变得神奇又有趣。想象一下&#xff0c;你正在游戏中与精灵搏斗&#xff0c;突然间身边的客…

EL面包屑导航实现

前言 el-breadcrumb 是 Element Plus 中的面包屑导航组件&#xff0c;主要用于展示当前页面在整个应用程序中的位置&#xff0c;并提供导航功能 https://element-plus.org/zh-CN/component/breadcrumb 基础用法 在 el-breadcrumb 中使用 el-breadcrumb-item 标签表示从首页开…

Qt 练习做一个登录界面

练习做一个登录界面 效果 UI图 UI代码 <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Dialog</class><widget class"QDialog" name"Dialog"><property name"ge…

c语言简单编程练习10

1、typedef和#define的区别 在用作数据类型替换时的区别&#xff1a; #include <stdio.h> #include <unistd.h>typedef char * A; //typedef需要&#xff1b; #define B char *int main(int argc, char *argv[]) {A a,b;B c,d;printf("a_size%ld\n"…

【spark的集群模式搭建】Standalone集群模式的搭建(简单明了的安装教程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接4、配置spark环境变量5、修改 spark-env.sh配置文件6、启动hdfs&#xff0c;创建文件夹7、修改spark-defaults.conf配置文件8、修改workers配置文件9、修改log4j.properties配置文件&#xff08;可选&…

ST-GCN模型实现花样滑冰动作分类

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

【RabbitMQ】03-交换机

1. 交换机 2. Fanout交换机 广播。生产者向exchange发消息 SpringBootTest public class SpringAmqpTest {Autowiredpublic RabbitTemplate rabbitTemplate;Testvoid testSimple() {String exchangName "hmall.fabout";rabbitTemplate.convertAndSend(exchangName…

【07】Maven项目多环境打包配置

&#xff08;1&#xff09;Web项目使用Maven进行多模块划分开发之后&#xff0c;面临一个问题&#xff0c;即如何加载不同环境的配置文件打包发布到不同的环境中&#xff1f; &#xff08;2&#xff09;不同的环境有开发环境、测试环境、线上生产环境等。 &#xff08;3&#x…

【Unity Shader】Special Effects(十)Change 变换(UI)

源码:[点我获取源码] 索引 Change 变换思路分析变换进度噪声纹理闪烁闪烁时机闪烁颜色闪烁动画Change 变换 变换的效果为图像间的切换带来动感过程,使用动画播放器: 思路分析 首先,从原始图像变换到目标图像是一个从0到1的过程,这个过程我们命名为变换进度(0为完全显…

关于wordpress instagram feed 插件 (现更名为Smash Balloon Social Photo Feed)

插件地址&#xff1a; Smash Balloon Social Photo Feed – Easy Social Feeds Plugin – WordPress 插件 | WordPress.org China 简体中文 安装后&#xff0c;配置教程&#xff1a; Setting up the Instagram Feed Pro WordPress Plugin - Smash Balloon 从这里面开始看就…