数据结构 ~ 栈

栈的总结

百度解释~

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

我的理解

从上面看到百度解释,栈是一种运算受限的线性表,仅能在表的一端进行插入和删除运算,举个例子,就像我们装衣服的收纳箱,把衣服叠好一件件装进收纳箱,放衣服,取衣服就像在栈上操作,你只能先把上面的衣服一件件取出来,即:先放的后取,后放的先取。放在栈上说,就是先进后出。

明白了栈的定义,现在要实际的实际,首先是它的逻辑结构:线性表。它是线性的。

存储结构

最常用的就是顺序存储跟链式存储,其中顺序存储用数组,链式存储用链表。下面就这2中存储方式分别写一下对栈的操作~

顺序存储结构

先进行分析下:首先要分配一个足够大的数组(这里就出现了一个问题,要是分配的空间小,就会出现溢出的情况,这是一个潜在的隐患,但是要是分配的太过大,又会出现浪费空间,对于链式存储,要多少就给多少,不用担心空间太小或浪费),现在有了这个数组,需要的还有,必须有个东西能一个控制一端不让操作(数组的前端从下标为0开始),一端要进行增删,这样就可以说是具备了栈有的特点,不让操作的叫栈底,进行操作的是栈顶~

栈的定义:~

#defien MAX 100
typedef struct STStack* pSTStack;
struct STStack
{
    int date[MAX];
    int top;   //控制栈顶
}; 

初始化~

pSTStack initialize()
{
    pSTStack S;
    S = (pSTStack)malloc(sizeof(STStack));
    S->top = -1;
    return S;
}

判空~

int IsEmpyt(pSTStack S)
{
    if(S->top==-1) {
         return 1;
    }
    else {
         return 0;
    }
}

进栈~

int  Push(pSTStack S,int x)
{
   if (S->top == MAX-1) {
       return 0;
   }
   else {
       S->top++;
       S->date[S->top]=x;
       return 1;
   }
}

出栈~

int Pop(pSTStack S,int &x)
{
     if(isEmpty(pSTStack S)==1) {
         return 0;
     }
     else {
        x = S->date[S->top];
        S->top--;
        return 1;
     }
}

得到栈顶~

int GetTopdate(pSTStack S)
{
    if(isEmpty(S) == 1) {
        return 0;
    }
    else {
        return S->date[s->top];
    }
}

销毁栈~

int Destroy(pSTStack *S)
{
    if(*S) {
        free(S);
        *S=NULL;
        return 1;
    }
    return 0;
}

链式存储结构

控制入栈出栈的端口,栈顶一般是链表的头,第一个节点,栈底一般是最后一个节点。

定义~

typedef struct pStack
{
    int date;
    struct pStack *next;

}m_pStack;

初始化~

void initStack(m_pStack *&a_Stack)  
{  
     a_Stack = new pStack;  
     a_Stack->next = NULL;  
}  

判空~

int isEmpty(m_pStack *a_Stack) 
{  
     if (NULL == a_Stack->next) {
          return 1;  
     }
     else {
          return 0;  
     }  
}  

进栈~

入栈:

int push(m_pStack *top, int x)
{
   m_pStack *p;

   if((p = ( m_pStack*)malloc(sizeof(m_pStack))) == NULL) {
        return 0;   
   }
   p->date = x;
   p->next = top->next;      //用的是头插法,top始终是栈顶。
   top->next = p;
   return 1;
}

出栈~

int pop(m_pStack* top)
{
    m_pStack* p;
    int x;
    if(NULL == top->next) {
        return NULL;
    }
    p=top->next;
    top->next=p->next; //删除节点,用x记录要删除的元素。
    x=p->date;
    free(p);
    return x;
}

以上,欢迎留言交流~

猜你喜欢

转载自blog.csdn.net/breakpoints_/article/details/80451275