採用順序存儲結構的棧稱爲順序棧。順序棧利用一組連續的存儲單元存放棧中的元素,存放順序依次從棧底到棧頂。由於棧中元素之間的存放地址的連續性,在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;
}