1. 程式人生 > >資料結構自學記錄(五):棧和佇列

資料結構自學記錄(五):棧和佇列

棧的定義:棧是一種只能在一端進行插入或刪除操作的線性表。

棧的一些概念: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;
}