資料結構自學記錄(五):棧和佇列
阿新 • • 發佈:2018-12-21
棧的定義:棧是一種只能在一端進行插入或刪除操作的線性表。
棧的一些概念:1.允許進行插入、刪除操作的一端稱為棧頂。
2.表的另一端稱為棧底。
3.當棧中沒有資料元素時,稱為空棧。
4.棧的插入操作通常稱為進棧或入棧。
5.棧的刪除操作通常稱為退棧或出棧。
棧的主要特點:先入先出(FIFO).
棧中元素邏輯關係與線性表的相同,棧可以採用與線性表相同的儲存結構,即可以使用順序棧,也可以使用鏈棧.
順序棧:
1.棧的結構定義:
typedef struct{
int data[MAXSIZE];
int top; //棧頂指標
}SqStack;
順序棧的四要素:1.棧空條件:top = -1
2.棧滿條件:top=MaxSize-1
3.進棧e操作:top++ 將e放在top處
總結: 1.約定top總是指向棧頂元素,初始值為-1.
2. 當top=MaxSize-1時不能再進棧-棧滿
3.進棧時top增1,出棧時top減1
4.退棧操作:從top處取出元素e, top--;棧的操作:
1.棧的初始化:
void InitStack(SqStack* &s)
{
s = (SqStack*)malloc(sizeof(SqStacks));
s->top = -1;
}
2.銷燬棧
void DestroyStack(SqStack* &s)
{
free(s);
}
3.判斷棧是否為空
bool isEmpty(SqStack*s)
{
return (s->top == 1)
}
4.進棧Push
bool Push(SqStack* &s,int ele) { //先判斷棧是否已經滿了 if(s->top == MAXSIZE-1) return false; s->top++; s->data[s->top] = ele; return true; }
5.出棧Pop
bool pop(SqStack* &s,int &ele)
{
if(s->top == -1)
return false;
e = s->data[s->top];
s->top--;
return true;
}
6.取棧頂元素
bool getTop(SqStack* &s,int &ele)
{
if(s->top == -1)
return false;
e = s->data[s->top];
return true;
}
棧的演算法設計例題:設計一個演算法利用順序棧判斷一個字串是否是對 稱串。所謂對稱串是指從左向右讀和從右向左讀的序列相同。
演算法設計思路:字串str的所有元素依次進棧,產生的出棧序列正好與str的順序相同,則是對稱串
演算法程式碼:
bool isSummetry(char str[])
{
int i;
char e;
SqStack* s;
for(i = 0;str[i] != '\0';i++)
Push(s,str[i]); //依次進棧
for(i = 0;str[i] != '\0';i++)
{
Pop(s,e);
if(str[i] != e)
{
DestoryStack(s);
return false;
}
}
DestoryStack(s);
return true;
}