数据结构-1

提示:分多次写完


前言

之前虽然学习了一些数据结构,但是对于不熟悉的还是完整梳理一遍


一、队列

队列是上个学期《啊哈!算法》的内容,里面讲述了数组实现的方法,焦味通俗易懂,但是这次自己用链表实现了一下。

定义:

队列是一种抽象资料型别,是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。 —维基百科

从字面意思可以看出,队列的重要性质:FIFO。
生活排队的时候就是如此,先进来的先出去。

以下分别是数组和链表实现队列

#include <stdio.h>
#include <conio.h> 
int n = 0;
int queue[100],head,tail;
//队头指向着当前队列的第一个,队尾其实必须在最后数据的后一个。 
void out()
{//出队操作
	head++;//head即下标,其增加就是把之前的出队 
	return;
}

void push()
{//入队,从tail入 
	if(tail>n)
	{
	 printf("已经越界!不可压入!\n");
	 getch();
	 return ; 
	}  
	
	printf("请输入想要压入的数字:");
	scanf("%d",&queue[tail++]);

	return ;
}

int main() {
	scanf("%d",&n);
	for (int i = 1; i <= n; i++)
		scanf("%d",&queue[i]);
	head = 1;
	tail = n + 1;//一直在后面空着的那个

	push();
	out();
	for(int i=head;i<tail;i++)
	 printf("%d ",queue[i]); 
	return 0;
}

以下是链表部分

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct node{
	int num;
	struct node *next;
}Node,*Link ;

Link Creat()//初始链表 
{
	Link head = (Link)malloc(sizeof(Node));
	head->next = NULL;
	Node *s,*r=head;
	printf("请输入要初始化的内容,输入0结束\n");
	int x;
	scanf("%d",&x);
	while(x)
	{
		s = (Link)malloc(sizeof(Node));//开辟节点
		s->num = x;//存入内容
		r->next= s;
		r=s;
		scanf("%d",&x); 
	} 
	r->next = NULL;
	return head ;
}

void Out(Link head)
{//出队操作,考虑到FIFO 只能把头节点后面那个去掉 
	Node *p = head->next ;
	head->next=p->next;
	free(p); //直接在头节点进行删除 
	return ; 
} 

void show(Link head)
{//打印内容 
	Node *p=head->next;
	while(p)
	{
		printf("%d ",p->num);
		p=p->next;
	}
	return ;
}
void In(Link head)
{//入队操作,FIFO原则决定了其必须在最后面增加数据 
	Link p=head->next;
	while(p->next)
		p = p->next;//一直往后找,必须找到最后面 
	
	printf("请输入要追加的内容:");
	int x;
	scanf("%d",&x);
	Link s = (Link)malloc(sizeof(Node));//开辟节点
	s->num = x;//存入内容
	p->next = s;
	p = s;
	p->next = NULL;
	
	return ;
 } 
int main()
{
	Node *head = Creat();
  
    Out(head);
    In(head);
    show(head);
    
	return 0;
} 

2、栈

数组实现 栈

#include <stdio.h>
int a[5],top = 1;//top表示栈底,从1开始 
void Init()
{//初始化 栈 
	printf("请输入要压入的数据:");
	while(1)
	{
		int t;
	    scanf("%d",&t);
		if(t!=0)
		  a[top++]=t;
		else 
		  break;
	 }
	 printf("初始化完成!\n"); 
	return ;
 } 

void push()
{//入栈操作 
	printf("请输入要压入的数据:");
	top++;
	if(top>4)
		printf("上溢出!\n");
	else
	    scanf("%d",&a[top]);
	 
		printf("压入完成!\n"); 
	
	return ; 
} 

int pop()
{
    if(top==0)
    {
    	printf("空栈不可再弹栈!");
    	return 0; 
	}
	
	int t = a[top] ;
	top--;   
	return t;
 }

void show()
{
	for(int i=1;i<=top;i++)
	  printf("%d ",a[i]);

    return ;
}
int main()
{
	Init();
    push();
    int a = pop();
	show(); 
	return 0;
 } 

2.两栈共享空间

之前我们知道,栈可以比喻为一种箱子
压箱底,就好比 栈底

在这里插入图片描述这是个传统的栈

在这里插入图片描述如果像两瓶子一样对齐然后合并,那么他们的空间可以做到共享
我暂时用不到的空间,可以借给你用;反之亦然

数组代码实现(其实也只能使用数组实现,因为由图可以看见,需要是
两个确定容量的 容器(栈),才可以对接

#include <stdio.h>
#define MAX 10//两个栈的总空间为10 

struct node{
	int num;
	char d;//属于左栈(l)还是右栈(r) 
}stack[10]; 

int left = -1,right = MAX;//左边要在-1开始,右边要从末尾的后一个开始 

int whether()
{//判断是否栈满 
	if(left+1==right)
	  return 1;
	else 
	  return 0;	
}


int FullLeft()
{//左栈底部是否空 
	if(left<0)
	{
		printf("左栈已空!");
		return 1; 
	}else{
		return 0; 
	} 
}

int FullRight()
{//右栈底部是否空 
	if(right>MAX-1)
	{
		printf("右栈已空!");
		return 1; 
	}else{
		return 0; 
	} 
}

void PushLeft()
{//压入左栈 
    if(whether())
	{
	printf("栈已满,不可继续压入!\n");
	return;	
	}
	printf("请输入您所需要从左压入的内容:");
	left++;
	scanf("%d",&stack[left].num);//先移动一下再存放
	stack[left].d='l';
	
	return ; 
}

void PushRight()
{//压入左栈 
    if(whether())
	{
	printf("请栈已满,不可继续压入!\n");
	return;	
	} 
	printf("请输入您所需要从右压入的内容:");
	scanf("%d",&stack[--right].num);//先移动一下再存放
	stack[right].d='r';
	
	return ; 
}    


void PopLeft()
{//从左边出栈 
   if(FullLeft())
   	return ;
   
	stack[left].num=0;//归零
	stack[left].d='n';//NONE的意思 
	left--;//完事了,回去 
	return ;
}

void PopRight()
{//从左边出栈 
    if(FullRight())
   	  return ;

	stack[right].num=0;//归零
	stack[right].d='n';//NONE的意思 
	right++;//完事了,回去 
	return ;
}



int main(){
	PushLeft();
	PushLeft();
	PushLeft();
	PushLeft();
	PushLeft();
	
	PushRight();
	PushRight();
	PushRight();
	PushRight();
	PushRight();
	
	PushRight();//这里第十一次压入内容,就会显示压入失败				
	for(int i=0;i<MAX;i++)
	{
		printf("%d是%d\n",i,stack[i].num);
	}
	return 0;
} 

二、使用步骤

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值