首页 > 其他分享 >数据结构实验第六周

数据结构实验第六周

时间:2024-10-11 15:25:26浏览次数:1  
标签:nx 结点 return int 第六周 实验 ans front 数据结构

6-1 在一个数组中实现两个堆栈

原理就是共享栈,不会的可以看我的数据结构博客

Stack CreateStack (int MaxSize)
{
    Stack S=(Stack)malloc(sizeof(struct SNode));//这个初始化记得写
    S->Top1=-1,S->Top2=MaxSize;//栈满的条件
    S->MaxSize=MaxSize;
    S->Data=(int*)malloc(sizeof(int)*MaxSize);//还有申请空间
    return S;
}

bool Push(Stack S,ElementType X,int Tag)
{
    if(S->Top2-S->Top1==1) {
        printf("Stack Full\n");//记得写这几个
        return false;
    }
    else{
        if(Tag==1){
           S->Data[++(S->Top1)]=X;//入队符号在前面,出队符号放后面
        }
        if(Tag==2){
            S->Data[--(S->Top2)]=X;
        }
        return true;
    }
 
}

ElementType Pop(Stack S,int Tag)
{
    if(Tag==1) {
        if(S->Top1==-1) {
            printf("Stack 1 Empty\n");//记得写
            return ERROR;
        }
        else return S->Data[(S->Top1)--];
    }
    else {
        if(S->Top2==S->MaxSize){
         printf("Stack 2 Empty\n");   //记得写
         return ERROR;
        }
        else return S->Data[(S->Top2)++];
    }
    

}

6-2 带头结点的链队列的基本操作

用链表来模拟队列,front一直指向头结点,rear随着元素的入队而移动,元素入队就是在头结点后面插入元素,出队就是删除头结点后的这个元素

Status QueueInsert(LinkQueue *Q, ElemType e) {
	LinkList p;
	p = (LNode *)malloc(sizeof (LNode )); //创建新结点
	p->data = e; //赋值
	p->next = NULL; //插入的结点总是为最后一个结点
	//下面两步为尾插法
	(*Q).rear->next = p;
	(*Q).rear = p;
	return 1;

}

Status QueueDelete(LinkQueue *Q, ElemType *e) {
	if ((*Q).rear == (*Q).front ) return ERROR; //如果是空队列
	//队头和队尾都指向头结点
	LNode *p = (*Q).front->next;

	*e = p->data; //这里要加星号 *e,没写就错

	//出队就是把头结点后的那个结点释放掉
	(*Q).front->next = p->next;
	if ((*Q).rear == p) (*Q).rear = (*Q).front; //原队列只有一个结点,删除后变空
	free(p);
	return OK;
}

7-1 表达式求值

遇到数字就入栈,遇到操作符就取出栈顶的两个数字进行计算,注意是栈顶第一个为符号右边的数,第二个为符号左边的数,计算完然后再放入栈中,直到栈最后剩一个元素就是答案

#include <bits/stdc++.h>
using namespace std;

int main()
{
   
    string s;
      while(cin>>s)//多组输入
      {
          double ans;
          stack<double >st;
          int n=s.size();
        for(int i=0;i<n;i++)
        {
            if(isdigit(s[i])) st.push(s[i]-'0');//数字入栈,注意转化
            else{
                if(st.size()){
                    double r=st.top();//第一个数为符号右边的数
                    st.pop();
                    double l=st.top();//第二个数为左边的数
                    st.pop();
                    //根据符号,算完入栈
                    if(s[i]=='+') st.push(l+r);
                    if(s[i]=='-') st.push(l-r);
                    if(s[i]=='*') st.push(l*r);
                    if(s[i]=='/') st.push(1.0*l/r);
                }
               
            }
            
        }
          ans=st.top();
          printf("%.2lf\n",ans);
      }
    

    
}

7-2 求解迷宫从入口到出口的路径

dfs+记录路径
注意题目说的 要按照右下左上的顺序来搜索,所以dx,dy要按相应顺序写
开两个数组,一个用来存当前路径下每个距离的坐标,一个用来存更新后的坐标

#include <bits/stdc++.h>
using namespace std;
//swj
char c[15][15];
int vis[15][15];
int n;
int dx[] = {0, 1, 0, -1};//方向数组
int dy[] = {1, 0, -1, 0};//方向数组
int minn = 1e9;
int pre[105][2];//记录移动距离为i的每个坐标(x,y)
int ans[105][2];


int flag = 0;
void dfs(int x, int y, int sum) {
	//swjswjswj swj swj
	if (x == n - 2 && y == n - 2) {
		flag = 1;
		minn = min(minn, sum);
		memset(ans, 0, sizeof ans);//把ans全赋值为0
		for (int i = 1; i < minn; i++) {
			ans[i][0] = pre[i][0];
			ans[i][1] = pre[i][1];
		}
	
		return;
	}

	for (int i = 0; i < 4; i++) {//每个dfs的for循环让其从右下左上来搜
		int nx = x + dx[i], ny = y + dy[i];
		if (!vis[nx][ny] && c[nx][ny] == '0' && nx > 0 && nx < n - 1 && ny > 0 && ny < n - 1) {
			//走过的标记一下,并且要在范围内走
			pre[sum][0] = nx;
			pre[sum][1] = ny;
			vis[nx][ny] = 1;
			dfs(nx, ny, sum + 1);//接着走
		}

	}

}



int main() {
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) cin >> c[i][j];

	vis[1][1] = 1;
	dfs(1, 1, 1);
	ans[0][0] = ans[0][1] = 1;
	if (flag) for (int i = 0; i < minn; i++) printf("(%d,%d)", ans[i][0], ans[i][1]);
	else cout << "NO";
	return 0;

}


7-3 银行业务队列简单模拟
开两个队列,一个放奇数,一个放偶数,然后按题意输出

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin>>n;
    vector<int>ve(n);
    for(int i=0;i<n;i++) cin>>ve[i];
    queue<int>a,b;
    for(int i=0;i<n;i++)
    {
        if(ve[i]&1) a.push(ve[i]);
        else b.push(ve[i]);
    }

    vector <int>ans;
    while(a.size()&&b.size())//这样条件保证了人数少的输出完就跳出循环
    {
        ans.push_back(a.front());
        a.pop();
        if(a.size()) ans.push_back(a.front()) ,a.pop();//可能输出一个后A就输出完了
        ans.push_back(b.front());
        b.pop();
    }

    //看哪个还有没输出的 把他们输出出来
    while(a.size()){
        ans.push_back(a.front());
        a.pop();
    }
    while(b.size())
    {
        ans.push_back(b.front());
        b.pop();
    }
    cout<<ans[0];
    for(int i=1;i<ans.size();i++) cout<<" "<<ans[i];
    
}

标签:nx,结点,return,int,第六周,实验,ans,front,数据结构
From: https://www.cnblogs.com/swjswjswj/p/18458354

相关文章

  • Vchitect 2.0:上海 AI 实验室推出的视频生成利器
    目录引言一、Vchitect2.0模型概述二、Vchitect2.0的技术特点1.超分辨率功能2.帧插入功能3.基于文本和图像的生成能力三、Vchitect2.0的应用场景四、Vchitect2.0测评报告五、生成视频样例六、本地部署推理1.环境准备2.安装依赖3.模型推理结语引言随......
  • 实验2
    任务1源代码1#include<time.h>2#defineN53#defineN13974#defineN24765#defineN3216intmain(){7intcnt;8intrandom_major,random_no;910srand(time(NULL));1112cnt=0;13while(cnt<N){14random_major=rand()%......
  • 实验1 Linux操作系统的安装
    目录1.实验目的和要求:2.主要仪器设备:3.实验内容和原理:(1)实验内容:(2)实验原理:4.操作方法和实验步骤(绘图):5.实验结果与分析(1)将登陆后的效果截图证明系统安装成功(2)回答问题:安装Linux系统一般需要哪些分区?(3)文件和目录类命令的使用(写下你所使用的命令)(4)系统信息类命令......
  • 20241011 大二上 数据结构与算法 堆
    1.堆排序堆排序是一种原地排序算法,即不需要额外的空间来存储数据,只需要在原数组上进行操作即可。堆排序是一种不稳定排序算法,即可能会改变相同元素的相对顺序。例如,如果数组中有两个相同的元素,它们可能会在排序过程中被交换,导致它们的顺序发生变化。堆排序的时间复杂度为O(nlog......
  • 实验2
    1#include<stdio.h>2#include<stdlib.h>3#include<time.h>45intmain(){6intluckyday,x,y=3;78printf("猜猜2024年11月哪一天会是你的luckyday\n");910srand(time(NULL));11luckyday=rand()......
  • 实验2
    实验2实验任务1:源代码:#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1397#defineN2476#defineN321intmain(){intcnt;intrandom_major,random_no;srand(time(NULL));//以当前系统时间作为随机种子cnt......
  • 20222415 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容本周学习了缓冲区溢出的相关知识,介绍了缓冲区和缓冲区溢出,并介绍了几种缓冲区溢出的实现方式。2.实验过程1.直接修改程序机器指令,改变程序执行流程1.1将目标文件pwn20222415通过共享文件夹放到kali里,运行pwn20222415.1.2输入objdump-dpwn1|more对pwn20222415......
  • 20222319zzs 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容1.1知识回顾1.1.1什么是缓冲区溢出?计算机中,如果程序试图向一个缓冲区填充超出它能够容纳的数据,溢出的数据可能会覆盖其他重要的内存区域,导致程序运行失败甚至崩溃,如果这些溢出数据是精心设计的.则攻击者就可以利用它们指向预先设计的攻击代码(shellcode)(Shellcode是核......
  • 实验1 现代C++编程初体验
    实验任务1代码1//现代C++标准库、算法库体验2//本例用到以下内容:3//1.字符串string,动态数组容器类vector、迭代器4//2.算法库:反转元素次序、旋转元素5//3.函数模板、const引用作为形参67#include<iostream>8#include<string>9......
  • 实验1 现代C++编程初体验
    任务1代码:1//现代C++标准库、算法库体验2//本例用到以下内容:3//1.字符串string,动态数组容器类vector、迭代器4//2.算法库:反转元素次序、旋转元素5//3.函数模板、const引用作为形参67#include<iostream>8#include<string>9#inc......