• 栈和队列




    栈: 使用数组实现,就要用类来表示,类可以保存携带数据。。
    // My_stack.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    
    class mystack
    {
    public:
        mystack(){top=0;}
        bool full();
        bool isEmpty();
        void push(int i);
        int pop();
        friend void print(mystack &);
        friend ostream& operator<<(ostream& os,mystack& ms);
    private:
        int a[10];
        int top;
    };
    ostream& operator<<(ostream& os,mystack& ms)
    {
        os<<ms.a;
        return os;
    }
    void print(mystack & ms)
    {
        for (int i=0;i<10;i++)
        {
            cout<<ms.a[i]<<" ";
        }
        cout<<endl;
    }
    bool mystack::full()
    {
        if (top==10)
            return true;
        else return false;
    }
    bool mystack::isEmpty()
    {
        if (top==0)return true;
        else return false;
    }
    
    void mystack::push(int i)
    {
        if (full())
            cout<<"stack overflow!"<<endl;
        else
        {
            top=top+1;
            a[top]=i;
        }
    }
    
    int mystack::pop()
    {
        if (isEmpty())
        {
            cout<<"stack underflow!"<<endl;
            return -1;
        }
        else
        {
            top--;
            return a[top+1];
        }    
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        mystack ms;
        cout<<ms.isEmpty()<<endl;
    
        for (int i=0;i<10;i++)
        {
            ms.push(2*i);
            cout<<"push "<<i<<endl;
        }
        cout<<ms.full()<<endl;
        print(ms);
        cout<<ms.pop()<<endl;
        system("pause");
        return 0;
    }
    my_stack

     用链表实现stack。算法导论10.2-2

    // stack.cpp : 定义控制台应用程序的入口点。
    //用链表实现栈
    
    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    typedef struct _Node
    {
        int data;
        _Node* next;
    }node;
    /*
    typedef struct _Stack
    {
        node* head=(node*)malloc(sizeof(node));
        head->next=head;
    }stack;
    */
    
    node* createNode(int data)
    {
        node* nnode=(node*)malloc(sizeof(node));
        nnode->data=data;
        nnode->next=NULL;
        return nnode;
    }
    /*
    node* createStack(int data)
    {
        node* head=(node*)malloc(sizeof(node));
        head->data=data;
        head->next=head;
        return head;
    }*/
    node* appendNode(node* head,int key)
    {
        node* new_node=createNode(key);
        node* p=head,*q;
        while (p!=NULL)
        {
            q=p;
            p=p->next;
        }
        q->next=new_node;
        return head;
    
        /*
        node* p=head,*q;
        if (p==NULL)
        {
            cout<<"stack is empty"<<endl;
            return NULL;
        }
        else 
        {
            
            node* new_node=createNode(key);
            while (p!=NULL)
            {
                q=p;
                p=p->next;
            }
            q->next=new_node;
        }
        return head;
        */
    }
    
    node* stack_push(node* head,int key)
    {
        node* p=head,*q;
        q=p->next;
        node* new_node=createNode(key);
        new_node->next=q;
        p->next=new_node;
        return head;
    }
    
    node* stack_pop(node* head)
    {
        node* p=head,*q;
        q=p->next;
        if (p==NULL)
        {
            cout<<"哎呦!"<<endl;
            return NULL;
        }
        else
        {
            p->next=q->next;
            free(q);
        }
        return head;
    }
    
    int top(node* head)
    {
        node* p=head;
        if (p->next==NULL)
        {
            cout<<"there is no elements in stack!"<<endl;
            return NULL;
        }
        else
        {
            return p->next->data;
        }
    }
    
    void print(node* head)
    {
        node* p=head;
        while (p!=NULL)
        {
            cout<<p->data<<" ";
            p=p->next;
            /*
            if(p!=NULL)
                p=p->next;
                cout<<p->data<<" ";
                之前这样写程序奔溃了,找半天,==
            */
        }
        cout<<endl;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        node* head=createNode(0);//头结点置为0
        for (int i=1;i<10;i++)
        {
            head=appendNode(head,i);
        }
        print(head);
        stack_push(head,10);
        cout<<top(head)<<endl;;
        stack_push(head,11);
        stack_push(head,12);
        print(head);
        for (int i=1;i<=12;i++)
        {
            stack_pop(head);
            print(head);
        }
        free(head);
        system("pause");
        return 0;
    }
    View Code

     队列:使用链表实现.算导10.2-3

    // My_queue.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    typedef struct node
    {
        int data;
        node* next;
    }Node;
    
    typedef struct myQueue
    {
        node* front;
        node* rear;
    }myQueue;
    
    myQueue* createQueue()
    {
        myQueue* q=(myQueue*)malloc(sizeof(node));//头结点
        q->front=NULL;
        q->rear=NULL;
        return q;
    }
    
    myQueue* enqueue(myQueue* q,int data)
    {
        Node* new_Node=(Node*)malloc(sizeof(Node));
        new_Node->data=data;
        new_Node->next=NULL;
        if (q->rear==NULL)
        {//队列为空,队首队尾都指向new_node
            q->front=q->rear=new_Node;
        }
        else
        {//不空,将新节点连接到最后一个节点q->rear之后
            q->rear->next=new_Node;
            q->rear=new_Node;
        }
        return q;
    }
    
    myQueue* dequeue(myQueue* q)
    {
        Node* dq=NULL;
        dq=q->front;
        if (dq==NULL)cout<<"empty!"<<endl;
        else
        {
            q->front=q->front->next;
            if (q->front==NULL)
                q->rear=NULL;//一个节点的情况
            free(dq);
        }
        return q;
    }
    
    int GetLength(myQueue* q)
    {
        Node* gq=NULL;
        gq=q->front;
        int i=0;
        while (gq!=q->rear)
        {
            i++;
            gq=gq->next;
        }
        i++;
        return i;
    }
    void print(myQueue* q)
    {
        Node* pq=NULL;
        pq=q->front;
        if(pq==NULL)
        {
            cout<<"empty!"<<endl;
            return;
        }
        while (pq!=q->rear)
        {
            cout<<pq->data<<" ";
            pq=pq->next;
        }
        cout<<q->rear->data<<endl;
        if(pq==NULL) cout<<"queue is empty!"<<endl;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        myQueue *mq=createQueue();
        print(mq);
        enqueue(mq,1);
        enqueue(mq,2);
        enqueue(mq,3);
        enqueue(mq,4);
        int i=GetLength(mq);
        print(mq);
        dequeue(mq);
        print(mq);
        dequeue(mq);
        print(mq);
        dequeue(mq);
        print(mq);
        dequeue(mq);
        print(mq);
        system("pause");
        return 0;
    }
    myqueue
  • 相关阅读:
    POJ 2068 Nim(博弈论)
    POJ 2311 Cutting Game (Multi-Nim)
    CodeForces 144B Meeting
    ZUFEOJ 2147 07染色带谜题
    CodeForces 779E Bitwise Formula
    CodeForces 779D String Game
    CodeForces 779C Dishonest Sellers
    CodeForces 779B Weird Rounding
    CodeForces 779A Pupils Redistribution
    HRBUST 1313 火影忍者之~静音
  • 原文地址:https://www.cnblogs.com/lp3318/p/4755617.html
Copyright © 2020-2023  润新知