数据结构笔记2---栈与队列

来源:互联网 发布:linux 启动进度条 编辑:程序博客网 时间:2024/05/16 16:08

导读

1.栈的数组模式
2.双堆栈模式(数组)
3.栈的链表模式
4.队列的数组模式
5.循环队列(数组)
6.队列链表模式

栈的数组模式

#include <iostream>using namespace std;#define MAXSIZE 100struct Stack{    int data[MAXSIZE];    int Top;};typedef Stack *stc;//创建stc init(){    stc stack=new Stack;    stack->Top=-1;    return stack;}//入栈void Push(stc &stack,int data){    if(stack->Top==MAXSIZE-1){        cout<<"It's full!"<<endl;    }    else{        stack->data[++(stack->Top)]=data;    }}//出栈int Pop(stc &stack){    if(stack->Top==-1){        cout<<"It's empty!"<<endl;        return NULL;    }else{        return (stack->data[(stack->Top)--]);    }}int main(){    stc stack;    stack=init();    Push(stack,1);    int a=Pop(stack);    cout<<a<<endl;    return 0;}

输出结果
1
Program ended with exit code: 0

双堆栈模式(数组)

//双堆栈思路:以两端为堆栈底,从两头向中间入栈,当栈顶指针相遇时为栈满。//为何不是从中间向两端入栈呢?避免一个栈已满,另一个栈还有很多空间#include <iostream>using namespace std;#define MAXSIZE 100struct DStack{    int data[MAXSIZE];    int Top1;    int Top2;};typedef struct DStack *stc;//创建stc init(){    stc Dstack=new DStack;    Dstack->Top1=-1;    Dstack->Top2=MAXSIZE;    return Dstack;}//插入数据void Push(stc &Dstack,int data,int flag){    if(Dstack->Top2-Dstack->Top1==1){        cout<<"It's full!"<<endl;        return ;    }    //flag=1插入堆栈1,反之插入堆栈2    if(flag==1){        Dstack->data[++(Dstack->Top1)]=data;    }    else        Dstack->data[--(Dstack->Top2)]=data;}//删除数据int Pop (stc &Dstack,int flag){    if(flag==1){        if(Dstack->Top1==-1){            cout<<"It's empty!"<<endl;            return NULL;        }        else{            return (Dstack->data[(Dstack->Top1)--]);        }    }    else{        if(Dstack->Top2==MAXSIZE){            cout<<"It's empty!"<<endl;            return NULL;        }        else            return (Dstack->data[(Dstack->Top2)++]);    }}int main(){    stc Dstack;    Dstack=init();    cout<<Pop(Dstack,1)<<endl;    for(int i=1;i<=10;i++){        Push(Dstack,i,1);        Push(Dstack,i,2);    }    cout<<Pop(Dstack,2)<<endl;    cout<<Pop(Dstack,1)<<endl;    return 0;}

输出结果
It’s empty!
0
10
10
Program ended with exit code: 0

栈的链表模式

⚠️头指针不存放数据

#include <iostream>using namespace std;typedef struct SNode *snode;struct SNode{    int data;    snode next;};//创建snode init(){    snode Stack=new SNode;    Stack->next=NULL;    return Stack;}//入栈void Push(snode &Stack,int data){    snode s=new SNode;    s->data=data;    s->next=Stack->next;    Stack->next=s;}//出栈int Pop(snode &Stack){    snode s;    int result;    if(Stack->next==NULL){        cout<<"It's empty!"<<endl;        return NULL;    }    else{        s=Stack->next;        Stack->next=Stack->next->next;        result=s->data;        delete(s);        return result;    }}//判空bool Isempty(snode Stack){    bool flag;    if(Stack->next==NULL)        flag=true;    else flag=false;    return flag;}int main(){    snode Stack;    Stack=init();    cout<<Pop(Stack)<<endl;    for(int i=1;i<=10;i++)        Push(Stack,i);    while(!Isempty(Stack)){        cout<<Pop(Stack)<<" ";    }    cout<<endl;    return 0;}

输出结果
It’s empty!
0
10 9 8 7 6 5 4 3 2 1
Program ended with exit code: 0

队列的数组模式

#include <iostream>using namespace std;#define MAXSIZE 50typedef struct QNode *queue;struct QNode{    int data[MAXSIZE];    int front;    int rear;};//创建queue init(){    queue queue=new QNode;    queue->front=-1;    queue->rear=-1;    return queue;}//入队void Push(queue &queue,int data){    if(queue->rear==MAXSIZE-1)        cout<<"It's full!"<<endl;    else    queue->data[++(queue->rear)]=data;}//出队int Pop(queue &queue){    if(queue->front==queue->rear){        cout<<"It's empty!"<<endl;        return NULL;    }    else{        return (queue->data[++(queue->front)]);    }}//判空bool Isempty(queue queue){    bool flag;    if(queue->front==queue->rear)        flag=true;    else flag=false;    return flag;}int main(){    queue queue;    queue=init();    cout<<Pop(queue)<<endl;    for(int i=1;i<=10;i++){        Push(queue,i);    }    while(!Isempty(queue)){        cout<<Pop(queue)<<" ";    }    cout<<endl;    return 0;}

输出结果
It’s empty!
0
1 2 3 4 5 6 7 8 9 10
Program ended with exit code: 0

循环队列(数组)

#include <iostream>using namespace std;#define MAXSIZE 5typedef struct QNode *queue;struct QNode{    int data[MAXSIZE];    int front;    int rear;};//创建queue init(){    queue queue=new QNode;    queue->front=-1;    queue->rear=-1;    return queue;}//入队void Push(queue &queue,int data){    if((queue->rear+1)%MAXSIZE==queue->front)    //+1的目的是判断循环队列是否放满        cout<<"It's full!"<<endl;    else{        queue->rear=(queue->rear+1)%MAXSIZE;    //取余法是实现循环的关键        queue->data[queue->rear]=data;    }}//出队int Pop(queue &queue){    if(queue->front==queue->rear){        cout<<"It's empty!"<<endl;        return NULL;    }    else{        queue->front=(queue->front+1)%MAXSIZE;        return queue->data[queue->front];    }}//判空bool Isempty(queue queue){    bool flag;    if(queue->front==queue->rear)        flag=true;    else flag=false;    return flag;}int main(){    queue queue;    queue=init();    cout<<Pop(queue)<<endl;    for(int i=1;i<=5;i++){        Push(queue,i);    }    while(!Isempty(queue)){        cout<<Pop(queue)<<" ";    }    cout<<endl;    return 0;}

输出结果
It’s empty!
0
1 2 3 4 5
Program ended with exit code: 0

队列链表模式

⚠️头指针不放数据

#include <iostream>using namespace std;//普通节点typedef struct Node *node;struct Node{    int data;    node next;};//表示队列的结构typedef struct QNode *queue;struct QNode{    node front;    node rear;};//创建queue init(){    node head=new Node;    queue queue=new QNode;    queue->front=queue->rear=head;    head->next=NULL;    return queue;}//入队void Push(queue &queue,int data){    node node=new Node;    node->data=data;    node->next=queue->rear->next;    queue->rear->next=node;    queue->rear=queue->rear->next;}//判空bool Isempty(queue queue){    bool flag;    if(queue->front->next==NULL)        flag=true;    else flag=false;    return flag;}//出队int Pop(queue &queue){    int result;    if(Isempty(queue)){        cout<<"It's empty!"<<endl;        return NULL;    }    else{        node node;        node=queue->front->next;        queue->front->next=queue->front->next->next;        result=node->data;        delete(node);        if(Isempty(queue))            queue->rear=queue->front;        //此处if判断非常重要,目的是在空栈时让rear回到原位        return result;    }}int main(){    queue queue;    queue=init();    cout<<Pop(queue)<<endl;    for(int i=1;i<=10;i++)        Push(queue,i);    while(!Isempty(queue))        cout<<Pop(queue)<<" ";    cout<<endl;    return 0;}

输出结果
It’s empty!
0
1 2 3 4 5 6 7 8 9 10
Program ended with exit code: 0

原创粉丝点击