程序11:数组实现大小固定的队列和栈

#include<iostream>  //数组实现大小固定的队列和栈
using namespace std;
#include<algorithm>  
#include<limits.h>

class ArraySatck     //数组栈
{ 
public:
    ArraySatck(int initSize)  //初始化
    {
        if(initSize<0)
        {
            throw "size is wrong";
        }
        arr = new int[initSize];
        index=0;
    }

    int peek()   //栈顶
    {
        if(index ==0)
        {
            throw "empty";
        }
        return arr[index-1];
    }
    void push(int obj)  //push
    {
        if(index==sizeof(arr)/sizeof(int))
        {
            throw "full";
        }
        arr[index++]=obj;
    }

    int pop()  //pop
    {
        if(index==0)
        {
            throw " null";
        }
        return arr[--index];
    }

    int *arr;
    int index;
};
class ArrayQueue  //数组队列
{
public:
    ArrayQueue(int initSize)
    {
        if(initSize<0)
        {
            throw " size is wrong";
        }
        arr=new int[initSize];
        size=0;
        end=0;
        start=0;
    }

    int peek()
    {
        if(size==0)
        {
            throw " empty";
        }
        return arr[start];
    }

    void push(int obj)
    {
        if(size==sizeof(int)/sizeof(int))
        {
            throw"full";
        }
        size++;
        arr[end]=obj;
        end= end==sizeof(int)/sizeof(int)-1?0:end+1;
   }

   int pop()
   {
       if(size==0)
       {
           throw "empty";
       }
       size--;
       int tmp=start;
       start= start==sizeof(int)/sizeof(int)-1?0:start+1;
       return arr[tmp];
   }

    int start;
    int end;
    int size;
    int *arr;

};

int main()
{    

    ArraySatck s1(3);
    s1.push(2);
    cout<<s1.arr[0]<<endl;
    ArrayQueue s2(6);
    s2.push(5);
    cout<<s2.arr[0]<<endl;
    return 0;
}

程序12:时间复杂度为O(1)的要求上返回栈的最小值

#include<iostream>  //返回栈中最小元素
using namespace std;
#include<stack>

 class myStack
 {
public:
    int getmin()
    {
        if(stackMin.empty())
        {
            throw "  empty";
        }
        return stackMin.top();
    }
    void push(int newNum)
    {
        if(stackMin.empty())
        {
            stackMin.push(newNum);
        }
        else if(newNum<getmin())
        {
            stackMin.push(newNum);
        }
        else
        {
            stackMin.push(stackMin.top());
        }
        stackData.push(newNum);

    }

    int pop()
    {
        if(stackMin.empty())
        {
            throw "   empty";
        }
        int tmp= stackMin.top();
        stackMin.pop();
        stackData.pop();
        return tmp;

    }

    stack<int> stackData;
    stack<int> stackMin;
 };

int main()
{    
    myStack s1;
    s1.push(4);
    s1.push(6);
    cout<<s1.stackMin.top()<<endl;
    return 0;
}

程序13:两个队列实现栈

#include<iostream>  //两个队列实现栈
using namespace std;
#include<stack>
#include<queue>

 class TwoQueuesStack
 {
public:

    void swap()
    {
        queue<int> tmp = help;
        help = data;
        data = tmp;
    }

    void push(int pushInt)
    {
        data.push(pushInt);
    }

    int pop()
    {
        if(data.empty())
        {
            throw " empty";
        }
        while(data.size()>1)
        {
            help.push(data.front());
            data.pop();
        }
        int res = data.front();
        data.pop();
        swap();
        return res;
    }
    queue<int> data;
    queue<int> help;
 };

int main()
{    

    TwoQueuesStack t1;
    t1.push(5);
    t1.push(10);
    t1.push(56);
    cout<<t1.pop()<<endl;
    return 0;
}

程序14:两个栈实现队列

#include<iostream>  //两个栈实现队列
using namespace std;
#include<stack>
#include<queue>

 class TwoStackQueues
 {
public:

    void push(int newData)
    {
        data.push(newData);
    }

    int pop()
    {
        if(data.empty()&&help.empty())
        {
            throw "empty";
        }
        else if(!help.empty())
        {
            int res = help.top();
            help.pop();
            return res;
        }
        while(!data.empty())
        {
            help.push(data.top());
            data.pop();
        }
        return help.top();
    }
    stack<int> data;
    stack<int> help;

 };

int main()
{    

    TwoStackQueues t1;
    t1.push(4);
    t1.push(8);
    t1.push(56);
    cout<<t1.pop()<<endl;

    return 0;
}

程序15:猫狗队列 未完整

#include<iostream>  //猫狗队列
using namespace std;
#include<string>
#include<queue>

class Pet
{
public:
    Pet();   //不可缺
    Pet(string type)
    {
        this->type = type;
    }
    string getType()
    {
        return this->type;
    }
    string type;
};

class Dog:public Pet
{ 
public:
    Dog():Pet("dog"){}

};

class Cat:public Pet
{
    Cat():Pet("cat"){}
};

class PetEnter
{
public:
    PetEnter(Pet pet, int count) //需要用到Pet的无参构造函数,所以Pet类既要有有参构造,也要有无参构造
    {
        this->pet = pet;
        this->count = count;
    }
    Pet getPet()
    {
        return pet;
    }
    int getCount()
    {
        return count;
    }
    string getEnterPetType()
    {
        return pet.getType();
    }
    Pet pet;
    int count;
};

class DogCatQueue
{
public:
    DogCatQueue()
    {
        count = 0;
    }

    void add(Pet pet)
    {
        if(pet.getType()=="dog")
        {
            dogQ.push(PetEnter(pet, count++)); //相当于 p=PetEnter(pet,count++);dogQ.push(p);
        }
        else if(pet.getType()=="cat")
        {
            catQ.push(PetEnter(pet, count++));
        }
        else
        {
            throw " not cat or dog";
        }
    };

    Pet pollAll()
    {
        if(!dogQ.empty()&&!catQ.empty())
        {
            if(dogQ.front().getCount()<catQ.front().getCount())
            {
                Pet tmp=dogQ.front().getPet();
                dogQ.pop();
                return tmp;
            }
            else
            {
                catQ.pop();
            }
        }
        else if(!dogQ.empty())
        {
            Pet tmp=dogQ.front().getPet();
            dogQ.pop();
            return tmp;
        }
        else if(!catQ.empty())
        {
            Pet tmp=catQ.front().getPet();
            catQ.pop();
            return tmp;
        }
        else
        {
            throw "empty";
        }       
    }
    void pollDog()
    {
        if(!dogQ.empty())
        {
            // Dog tmp=dogQ.front().getPet();  //只有子类转换成父类,父类不可能转换成子类。
            dogQ.pop();
        }
        else
        {         
            throw "dog is empty";
        }      
    }

    void pollCat()
    {
        if(!catQ.empty())
        {
            catQ.pop();
        }
        else
        {         
            throw "cat is empty";
        }
    }

    bool isEmpty()
    {
        return dogQ.empty()&&catQ.empty();
    }
    queue<PetEnter> dogQ;
    queue<PetEnter> catQ;
    int count;
};

int main()
{
    DogCatQueue q;
    Pet p("dog");
    q.add(p);
    cout<<q.pollAll().getType()<<endl;

    return 0;
}

程序16:转圈打印数组

#include<iostream>  //转圈打印数组
using namespace std;


void printEdge(int arr[3][4], int tR,int tC,int dR,int dC)
{
    if(tR==dR)
    {
        for(int i=tC;i<=dC;i++)
        {
            cout<<arr[tR][i]<<"  ";
        }
    }
    else if(tC==dC)
    {
        for(int i=tR;i<=dR;i++)
        {
            cout<<arr[i][tC]<<"  ";
        }
    }
    else
    {
        int curC=tC;
        int curR=tR;
        while(curC!=dC)
        {
            cout<<arr[tR][curC++]<<"  ";
        }
        while (curR!=dR)
        {
            cout<<arr[curR++][dC]<<" ";
        }
        while (curC!=tC)
        {
            cout<<arr[dR][curC--]<<"  ";
        }
        while (curR!=tR)
        {
            cout<<arr[curR--][tC]<<"  ";
        }
    }

}
void spiralOrderPrint(int arr[3][4])
{
    int tR=0;
    int tC=0;
    int dR=2;
    int dC=3;

    while(tR<=dR&&tC<=dC)
    {
        printEdge(arr,tR++,tC++,dR--,dC--);
    }

}


int main()
{
    int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
    spiralOrderPrint(arr);
    return 0;
}

程序17:正方形数组顺时针旋转90°

#include<iostream>  //正方形数组顺时针旋转90°
using namespace std;


void rotateEdge(int arr[][4], int a,int b,int c,int d)
{
    int times=d-b;
    for(int i=0;i!=times;i++)
    {
        int tmp=arr[a][b+i];
        arr[a][b+i]=arr[c-i][b];
        arr[c-i][b]=arr[c][d-i];
        arr[c][d-i]=arr[a+i][d];
        arr[a+i][d]=tmp;
    }

}
void rotate(int arr[][4])
{
    int tR=0;
    int tC=0;
    int dR=sizeof(arr[0])/sizeof(int)-1;
    int dC=sizeof(arr[0])/sizeof(int)-1;

    while(tR<dR)
    {
        rotateEdge(arr,tR++,tC++,dR--,dC--);
    }

}


int main()
{
    int arr[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    rotate(arr);
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            cout<<arr[i][j]<<"  ";
        }
        cout<<endl;
    }
    return 0;
}

程序18:"之"字形打印二维数组

#include<iostream>  //之字形打印
using namespace std;


void printLevel(int arr[][4],int aR,int aC,int bR,int bC,bool flag)
{
     if(flag)
     {
         while (aR!=bR+1)
         {
            cout<<arr[aR++][aC--]<<"  ";
         }

     }
     else
     {
        while (bR!=aR-1)
        {
            cout<<arr[bR--][bC++]<<"  ";
        }

     }

}
void printMatrixZigZag(int arr[][4],int R,int C)
{
    int aR=0;
    int aC=0;
    int bR=0;
    int bC=0;
    int endR=R-1;
    int endC=C-1;
    bool flag=false;
    while (aR!=endR+1)
    {
        printLevel(arr,aR,aC,bR,bC,flag);
        aR=aC==endC?aR+1:aR;
        aC=aC==endC?aC:aC+1;
        bC=bR==endR?bC+1:bC;   //这行与下面一行的顺序不能颠倒,因为bR在这个过程中值发生了改变
        bR=bR==endR?bR:bR+1; 
        flag=!flag;
    }
}


int main()
{
    int arr[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    int arrR = sizeof(arr)/sizeof(arr[0]);
    int arrC = sizeof(arr[0])/sizeof(int);
    printMatrixZigZag(arr,arrR,arrC);
    return 0;
}

程序19:链表是否为回文结构

#include<iostream>  //是否为回文结构
using namespace std;
#include<stack>

struct Node
{
    int value;
    Node *next;
};

bool isPalindrmoe1(Node *head)   //need N extra space
{
    stack<Node> s;
    Node *cur=head;
    while (cur!=NULL)
    {
        s.push(*cur);
        cur=cur->next;
    }
    while (head!=NULL)
    {
        if(head->value!=s.top().value)
        {
            return false;
        }
        s.pop();
        head=head->next;
    }
    return true;
}

 bool isPalindrmoe2(Node *head)  //need N/2 extra space
 {
     if(head==NULL&&head->next==NULL)
     {
         return true;
     }
     Node *right=head->next;
     Node *cur=head;
    while (cur->next!=NULL&&cur->next->next!=NULL)
    {
        right=right->next;   //right处的也要进栈
        cur=cur->next->next;
    }
    stack<Node>s;
    while (right!=NULL)
    {
        s.push(*right);
        right=right->next;
    }
    while (!s.empty())
    {
        if(head->value!=s.top().value)
        {
            return false;
        }
        head=head->next;
        s.pop();
    }
    return true;
 }

 bool isPalindrmoe3(Node *head)  //need O(1) extra space
 {
    if(head==NULL&&head->next==NULL)
    {
        return true;
    }
    Node *n1=head;
    Node *n2=head;
    while (n2->next!=NULL&&n2->next->next!=NULL)
    {
        n1=n1->next;
        n2=n2->next->next;
    }
    n2=n1->next;
    n1->next=NULL;
    Node *n3=NULL;
    while (n2!=NULL)
    {
        n3=n2->next;
        n2->next=n1;
        n1=n2;
        n2=n3;
    }
    n3=n1;  //记录最后一个节点
    n2=head; 
    bool res=true;
    while (n1!=NULL&&n2!=NULL)
    {
        if(n1->value!=n2->value)
        {
            res=false;
            break;
        }
        n1=n1->next;
        n2=n2->next;
    }
    n1=n3->next;
    n3->next=NULL;
    while (n1!=NULL)   //将原链表恢复原样
    {
        n2=n1->next;
        n1->next=n3;
        n3=n1;
        n1=n2;
    }
    return res;
 }
int main()
{
    Node *head1 = NULL;
    Node *head2 = NULL;
    Node *ptr = NULL;

    for(int i =1;i<6;i++)//构造链表
    {
        if(NULL == head1)
        {    
        head1 = new Node;
        head1->value = i;
        head1->next = NULL;
        ptr = head1;
        continue;
        }
        ptr->next = new Node;
        ptr = ptr->next;
        ptr->value = i;
        ptr->next = NULL;
    }

    Node *right = NULL;
    Node *tmp = NULL;
    for(int i =1;i<5;i++)//构造回文结构的链表
    {
        if(head2==NULL&&right==NULL )
        {    
            head2 = new Node;
            head2->value = i;
            head2->next = NULL;
            ptr = head2;

            right = new Node;
            right->value = 5-i;
            right->next = NULL;
            tmp = right;
            continue;
        }
        ptr->next = new Node;
        ptr = ptr->next;
        ptr->value = i;
        ptr->next = NULL;

        tmp->next = new Node;
        tmp = tmp->next;
        tmp->value =5-i;
        tmp->next = NULL;
    }
    ptr->next = right;

    cout<<isPalindrmoe3(head2);
    return 0;
}

程序20:单链表安某值划分为三部分

#include<iostream>  //单链表安某值划分为三部分
using namespace std;
#include<stack>

struct Node
{
    int value;
    Node *next;
};

Node* listPartition(Node *head,int num)
{
    Node *sH=NULL;
    Node *sT=NULL;
    Node *eH=NULL;
    Node *eT=NULL;
    Node *bH=NULL;
    Node *bT=NULL;
    Node *next=NULL;
    while (head!=NULL)
    {
        next=head->next;
        head->next=NULL;
        if(head->value<num)
        {
            if(sH==NULL)
            {
                sH=head;
                sT=head;
            }
            else
            {
                sT->next=head;
                sT=head;
            }

        }
        else if(head->value==num)
        {
            if(eH==NULL)
            {
                eH=head;
                eT=head;
            }
            else
            {
                eT->next=head;
                eT=head;
            }
        }
        else if(head->value>num)
        {
            if(bH==NULL)
            {
                bH=head;
                bT=head;
            }
            else
            {
                bT->next=head;
                bT=head;
            }
        }
        head=next;
    } 
    if(sT!=NULL)
    {
        sT->next=eH;
        eT=eT==NULL?sT:eT;
    }
    if(eT!=NULL)
    {
        eT->next=bH;
    }
    return sH!=NULL?sH:eH!=NULL?eH:bH;

}

int main()
{
    Node *head1 = NULL;
    Node *head2 = NULL;
    Node *ptr = NULL;

    for(int i =1;i<5;i++)//构造链表
    {
        if(head1==NULL)
        {    
        head1 = new Node;
        head1->value = i;
        head1->next = NULL;
        ptr = head1;
        continue;
        }
        ptr->next = new Node;
        ptr = ptr->next;
        ptr->value = i;
        ptr->next = NULL;
    }
    ptr->next = new Node;
    ptr = ptr->next;
    ptr->value = 2;
    ptr->next = NULL;
    ptr->next = new Node;
    ptr = ptr->next;
    ptr->value = 4;
    ptr->next = NULL;
    Node * p=listPartition(head1,3);
    while (p!=NULL)
    {
        cout<<p->value<<" ";
        p=p->next;
    }


    return 0;
}