顺序表实现栈

/*  使用顺序表存储栈的过程,同时使用了remalloc函数
  对于顺序栈满的情况进行了扩展,是将原先的数据拷贝
  过来,然后进行增长
*/

#define STACK_INIT_SIZE 3  //顺序栈的初始化分配空间
#define STACK_INCREASE_SIZE 6//顺序栈的分配增量
typedef struct SStackNode
{
    int nStackElement;
    SStackNode* pNextNode;
}SStackNode;

class CSeqStack
{
private:
    SStackNode* pCStackTop;
    SStackNode* pCStackButton;
    int m_nStackSize;
public:
    CSeqStack()
    {
        m_nStackSize=STACK_INIT_SIZE;
        pCStackTop=pCStackButton=NULL;
        pCStackTop=pCStackButton=(SStackNode*)malloc(STACK_INIT_SIZE*sizeof(SStackNode));
        if(NULL==pCStackButton)
        {
            cout<<"can not malloc memory and exit"<<endl;
            exit(-1);
        }
    }

    ~CSeqStack()
    {
        free(pCStackButton);
    }
    int GetTop(int& a)
    {
        if(pCStackTop==pCStackButton) return -1;

        SStackNode* pTmp=pCStackTop;
        a=(--pTmp)->nStackElement;
        return 0;
    }
    int PushStack(int a)
    {
        /*
        if(pCStackTop>=pCStackButton+stacksize)
        {
            SStackNode* pTmp=(SStackNode*)realloc(pCStackButton,MAXSTACKSIZE*sizeof(SStackNode));
            if(NULL==pTmp)
            {
                cout<<"can not remalloc memory and exit"<<endl;
                exit(-1);
            }
            pCStackButton=pTmp;
            pCStackTop=pTmp+stacksize;
            cout<<"start to increase stack size"<<endl;
        }
        cout<<"Puahs a into stack:"<<a<<endl;
        pCStackTop->nStackElement=a;
        pCStackTop++;
        */
        /*
          如果使用了上面的语句,发现stacksize=3时候允许进栈3个元素,然后需要扩展,然后元素4进栈,这个时候再次
          检测到当前栈已满,因为stacksize还是3没有变化,所以这里就有一问题:重新扩展,然后元素5进栈,但是却覆盖
          元素4,所以这里的stacksize在扩展之后需要进行修改,按照数据结构上的提供了初始化分配量和增量
         */
        if(pCStackTop>=pCStackButton+m_nStackSize)
        {
            SStackNode* pTmp=(SStackNode*)realloc(pCStackButton,(STACK_INIT_SIZE+STACK_INCREASE_SIZE)*sizeof(SStackNode));
            if(NULL==pTmp)
            {
                cout<<"can not remalloc memory and exit"<<endl;
                exit(-1);
            }
            pCStackButton=pTmp;
            pCStackTop=pTmp+m_nStackSize;
            m_nStackSize=m_nStackSize+STACK_INCREASE_SIZE;
            cout<<"start to increase stack size"<<endl;
        }
        cout<<"Puahs a into stack:"<<a<<endl;
        pCStackTop->nStackElement=a;
        pCStackTop++;
    }
    int PopStack(int& a)
    {
        if(pCStackTop==pCStackButton) return -1;

        SStackNode e;
        e=*--pCStackTop;
        return 0;
    }
    int PrintStack()
    {
        SStackNode* pTmp=pCStackTop;
        while(pCStackButton!=pTmp)
        {
            pTmp--;
            cout<<"Now stack value is:"<<pTmp->nStackElement<<"point:"<<pTmp<<endl;
        }
        cout<<"This is inverse traverse"<<endl;
        pTmp=pCStackButton;
        while(pCStackTop!=pTmp)
        {
            cout<<"Now stack value from button is:"<<pTmp->nStackElement<<"point:"<<pTmp<<endl;
            pTmp++;
        }
        return 0;
    }
};


//匹配字串 KMP

int RollMetrix()
{
    int array[5][5]={0};
    int nNowFillData=0;
    int nRow=0;
    int nSeq=0;
    int n=0;
    int m=0;
    int nScanl=5;
    while(nScanl>0)
    {
        m=n+nScanl;
        for(nRow=0;n<m;nRow++)
        {
            array[nSeq][nRow]=nNowFillData++;   n++;
        }

        m=n+nScanl-1;
        for(nSeq=nSeq+1;n<m;nSeq++)
        {
            array[nSeq][nRow]=nNowFillData++;   n++;
        }

        m=n+nScanl-1;
        for(nRow=nRow-1;n<m;nRow--)
        {
            array[nSeq][nRow]=nNowFillData++;   n++;
        }

        m=n+nScanl-2;
        for(nSeq=nSeq-1;n<m;nSeq--)
        {
            array[nSeq][nRow]=nNowFillData++;   n++;
        }
        nScanl=nScanl-2;

    }

    for(int i=0;i<5;i++)
    {
        for(int j=0;i<5;j++)
        {
            cout<<array[i][j]<<" ";
        }
        cout<<endl;
    }

}

void TestSeqStack()
{
    CSeqStack stack;
    stack.PushStack(1);
    stack.PushStack(2);
    stack.PushStack(3);
    stack.PushStack(4);
    stack.PushStack(5);
    stack.PrintStack();
}

你可能感兴趣的:(顺序栈)