數據結構:順序棧的基本操作

       採用順序存儲結構的棧稱爲順序棧。順序棧利用一組連續的存儲單元存放棧中的元素,存放順序依次從棧底到棧頂。由於棧中元素之間的存放地址的連續性,在C語言中,同樣採用數組實現棧的順序存儲。另外,增加一個棧頂指針top,用於指向順序棧的棧頂元素。


       通常top=0或者top=-1表示棧爲空。兩者的區別簡單概括如下:

  • top=0表示棧爲空時,top指向棧底,所以每次在壓棧時,先將數據元素壓入棧,再對指針進行++操作,使指針後移;top=-1表示棧爲空,壓棧時恰恰相反,先對棧頂指針進行++操作,然後再將數據壓入棧中,
  • 在求棧的長度,(即:棧中元素個數時)只需要返回或打印棧頂指針的值; 而由於top=-1表示棧底時,每次對棧中元素操作時先對棧頂指針進行操作,所以在求棧的長度,即棧中元素個數時,需要返回top+1的值;
  • 棧空條件爲top == 0 或 top == -1,時棧滿條件均爲 top = MAXSIZE -1;

順序棧的基本操作

/*源代碼*/

#include <stdio.h>
#include <Windows.h>

#define MAXSIZE 100
typedef int DataType;

typedef struct
{
    DataType stack[MAXSIZE];
    int top;  
}SeqStack;

/*初始化棧,把棧初始化爲空,把棧頂指針置爲-1*/
void InitStack(SeqStack * s)
{
    s->top = -1;
}

/*判空操作,當棧頂指針爲top 爲-1,棧爲空*/
int StackEmpty(SeqStack s)
{
    if (s.top == -1)
    {
        return 1;
    }
    return 0;
}

/*入棧操作,棧頂指針top++,然後將data值壓入棧中*/
int StackPush(SeqStack* s, DataType data)
{
    if (s->top == MAXSIZE)
    {
        printf("棧已滿,不能入棧!\n");
        return 0;
    }
    else
    {
        s->top++;
        s->stack[s->top] = data;
        return 1;
    }
}

/*取棧頂元素,將棧頂元素輸出*/
int StackGetTop(SeqStack s)
{
    if (s.top==-1)
    {
        printf("棧爲空!\n");
        return 0;
    }
    else
    {
        printf("%d\n", s.stack[s.top]);
        s.top--;
    }
}
/*輸入要入棧的元素以 -1 作爲結束標誌*/

void StackInput(SeqStack* s)
{
    int data;
    scanf_s("%d", &data);
    while (data != -1)
    {
        StackPush(s, data);
        scanf_s("%d", &data);
    }
}

/*打印棧中元素*/
void Display(SeqStack s)
{
    int i;

    for (i = s.top; i >= 0; i--)
    {
        printf("%-3d", s.stack[i]);
    }
    printf("\n");
}
/*出棧操作,將棧頂指針top-- */
void StackPop(SeqStack* s)
{
    if (s->top==-1)
    {
        printf("棧爲空!\n");
    }
    else
    {
        s->top--;
    }
}

/*返回棧的長度,棧的長度就是棧中元素的個數*/
int StackLength(SeqStack s)
{
     s.top + 1;
     printf("%d\n", s.top + 1);
     return 0;
}

/*清空棧,清空棧與初始化棧的操作一樣,只需將棧頂指針置-1即可*/
void StackClear(SeqStack* s)
{
    s->top = -1;
}
int main()
{
    SeqStack s;
    InitStack(&s);

    printf("輸入入棧元素:\n");
    StackInput(&s);
    printf("棧中元素爲:\n");
    Display(s);
    printf("棧頂元素爲:\n");
    StackGetTop(s);
    printf("棧中元素個數爲:\n");
    StackLength(s);
    printf("退一次棧!\n");
    StackPop(&s);
    printf("棧中元素爲:\n");
    Display(s);
    StackClear(&s);

    system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章