数据结构学习笔记(一) 顺序表

这里是C++实现的有关顺序表的一些基本操作,包括向量、栈和队列的增删改查,以及一些实际问题的应用。

一、向量。

#include<iostream>
using namespace std;
//抽象数据类型
#define MaxSize 100
typedef int datatype;
typedef struct
{
    datatype V[MaxSize];
    int n;
}SeqList;

//向量插入
void Insert(SeqList &L,int i,datatype x)
{
    //参数检查
    if(i<0||i>L.n)
    {
        cout<<"position error!"<<endl;
        return;
    }
    if(L.n>=MaxSize)
    {
        cout<<"overflow!"<<endl;
        return;
    }
    for(int j=L.n-1;j>=i;j--)
        L.V[j+1]=L.V[j];
    L.V[i]=x;
    L.n++;
}

//向量删除
void Delete(SeqList &L,int i)
{
    if(i<0||i>L.n-1)
    {
        cout<<"position error!"<<endl;
        return;
    }
    if(L.n==0)
    {
        cout<<"underflow!"<<endl;
        return;
    }
    for(int j=i;j<L.n;j++)
        L.V[j]=L.V[j+1];
    L.n--;
}

int main()
{
    int x,y;
    SeqList L;
    L.n=5;
    cout<<"请输入五个元素:"<<endl;
    for(int i=0;i<L.n;i++)
        cin>>L.V[i];

    cout<<"插入位置、元素:"<<endl;
    cin>>y>>x;
    Insert(L,y-1,x);
    for(int i=0;i<L.n;i++)
        cout<<L.V[i]<<endl;

    cout<<"删除位置:"<<endl;
    cin>>y;
    Delete(L,y-1);
    for(int i=0;i<L.n;i++)
        cout<<L.V[i]<<endl;

    return 0;
}

二、栈。

#include<iostream>
using namespace std;
//抽象数据类型
#define MaxSize 100
typedef int datatype;
typedef struct
{
    datatype S[MaxSize];
    int top;
}SeqStack;

//栈的推入
void Push(SeqStack &ST,datatype x)
{
    //参数检查
    if(ST.top>=MaxSize-1)
    {
        cout<<"overflow!"<<endl;
        return;
    }
    ST.top++;//注意是top先++!
    ST.S[ST.top]=x;
}

//栈的弹出
void Pop(SeqStack &ST)
{
    //参数检查
    if(ST.top==-1)
    {
        cout<<"underflow!"<<endl;
        return;
    }
    ST.top--;
}

//读栈顶元素
datatype GetTop(SeqStack &ST)
{
    //参数检查
    if(ST.top==-1)
    {
        cout<<"error!"<<endl;
        return 0;
    }
    return ST.S[ST.top];
}

int main()
{
    SeqStack ST;
    datatype x;
    ST.top=4;
    cout<<"请输入5个元素:"<<endl;
    for(int i=0;i<5;i++)
        cin>>ST.S[i];
    cout<<"栈顶元素为:"<<endl<<GetTop(ST)<<endl;
    cout<<"推入元素:"<<endl;
    cin>>x;
    Push(ST,x);
    for(int i=0;i<=ST.top;i++)//top就是下标!
        cout<<ST.S[i]<<endl;
    cout<<"弹出元素:"<<endl;
    Pop(ST);
    for(int i=0;i<=ST.top;i++)
        cout<<ST.S[i]<<endl;
    return 0;
}

三、队列。

#include<iostream>
using namespace std;
//抽象数据类型
#define MaxSize 7
typedef int datatype;
typedef struct
{
    datatype Q[MaxSize];
    int front;
    int rear;
}SeqQueue;

//入队
void EnQueue(SeqQueue &QU,datatype x)
{
    //参数检查
    if(QU.front==(QU.rear+1)%MaxSize)//注意此时溢出的判断方法,真溢出!
    {
        cout<<"overflow!"<<endl;
        return;
    }
    QU.Q[QU.rear]=x;
    QU.rear=(QU.rear+1)%MaxSize;//注意此时rear的移动方式!
}

//出队
void DeQueue(SeqQueue &QU)
{
    //参数检查
    if(QU.front==QU.rear)//注意此时下溢的判断方法!
    {
        cout<<"underflow!"<<endl;
        return;
    }
    QU.front=(QU.front+1)%MaxSize;
}

//读取队头元素
datatype GetFront(SeqQueue &QU)
{
    //参数检查
    if(QU.front==QU.rear)
    {
        cout<<"error!"<<endl;
        return 0;
    }
    return QU.Q[QU.front];
}

int main()
{
    SeqQueue QU;
    datatype x;
    QU.front=0;
    QU.rear=5;//rear的值为元素个数值!不是下标!
    cout<<"请输入5个元素:"<<endl;
    for(int i=0;i<5;i++)
        cin>>QU.Q[i];
    cout<<"插入元素:"<<endl;
    cin>>x;
    EnQueue(QU,x);
    cout<<"front= "<<QU.front<<" "<<"rear= "<<QU.rear<<endl;
    while(QU.front!=QU.rear)//注意这里的遍历方式!
    {
         cout<<QU.Q[QU.front]<<endl;
         QU.front=(QU.front+1)%MaxSize;
    }
    QU.front=(QU.front+1)%MaxSize;
    cout<<"删除元素"<<endl;
    DeQueue(QU);
    cout<<"front= "<<QU.front<<" "<<"rear= "<<QU.rear<<endl;
    while(QU.front!=QU.rear)//注意这里的遍历方式!
    {
         cout<<QU.Q[QU.front]<<endl;
         QU.front=(QU.front+1)%MaxSize;
    }
    return 0;
}

四、队列应用_输出杨辉三角形。

#include<iostream>
#define MaxSize 100
using namespace std;

//变量类型与声明
typedef int datatype;
typedef struct
{
    datatype Q[MaxSize];
    int front,rear;
}SeqQueue;
SeqQueue QU;

//置空队
void ClearQueue(SeqQueue &QU)
{
    QU.front=0;
    QU.rear=0;
}

//入队,使用循环队列
void EnQueue(SeqQueue &QU,datatype x)
{
    //参数检查
    if(QU.front==(QU.rear+1)%MaxSize)
    {
        cout<<"overflow!"<<endl;
        return;
    }
    QU.Q[QU.rear]=x;
    QU.rear=(QU.rear+1)%MaxSize;
}

//出队
void DeQueue(SeqQueue &QU,datatype &x)
{
    //参数检查
    if(QU.rear==QU.front)
    {
        cout<<"underflow!"<<endl;
        return;
    }
    x=QU.Q[QU.front];
    QU.front=(QU.front+1)%MaxSize;
}

//判断队是否为空,为空则返回1,不为空则返回0
int QueueEmpty(SeqQueue &QU)
{
    if(QU.rear==QU.front)
        return 1;
    return 0;
}

//输出n级杨辉三角
void YangHuiTriangle(SeqQueue &QU,int n)
{
    int i,j;
    datatype s,t;
    ClearQueue(QU);
    EnQueue(QU,1);
    EnQueue(QU,1);
    cout<<1<<" "<<1<<endl;
    for(i=2;i<=n;i++)
    {
        EnQueue(QU,1);
        cout<<1<<" ";
        DeQueue(QU,s);//获取第i行的第一个元素s
        for(j=2;j<=i;j++)
        {
            DeQueue(QU,t);//获取前一行第j个数据t
            EnQueue(QU,s+t);
            cout<<s+t<<" ";
            s=t;
        }
        EnQueue(QU,1);
        cout<<1<<endl;
    }
    cout<<endl;
}

//测试函数
int main()
{
    int n;
    ClearQueue(QU);
    cout<<"请输入杨辉三角的级数:"<<endl;
    cin>>n;
    cout<<endl;
    YangHuiTriangle(QU,n);
    return 0;
}

五、栈的应用_数制转换。

#include<iostream>
#define MaxSize 100
using namespace std;

//变量类型与声明
typedef int datatype;
typedef struct
{
    datatype S[MaxSize];
    int top;
}SeqStack;
SeqStack ST;

//初始化栈
void InitStack(SeqStack &ST)
{
    ST.top=-1;
}

//入栈
void Push(SeqStack &ST,datatype x)
{
    //参数检查
    if(ST.top>=MaxSize-1)
    {
        cout<<"overflow!"<<endl;
        return;
    }
    ST.S[++ST.top]=x;
}

//弹栈
datatype Pop(SeqStack &ST)
{
    //参数检查
    if(ST.top==-1)
    {
        cout<<"underflow!"<<endl;
        return 0;
    }
    return ST.S[ST.top--];
}

//判断是否为空栈,是则返回1,不是则返回0
int StackEmpty(SeqStack &ST)
{
    if(ST.top==-1)
        return 1;
    return 0;
}

//按d进制转换为N进制整数并输出
void conversion(int d,int N)
{
    cout<<"用"<<N<<"进制表示的"<<d<<"为:"<<endl;
    while(d)
    {
        Push(ST,d%N);
        d/=N;
    }
    while(!StackEmpty(ST))
        cout<<Pop(ST);
    cout<<endl;
}

//测试函数
int main()
{
    int d,N;
    InitStack(ST);
    cout<<"请输入一个十进制数,并输入需要转化的进制:"<<endl;
    cin>>d>>N;
    conversion(d,N);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值