1. 程式人生 > >棧的順序儲存結構和鏈式儲存結構

棧的順序儲存結構和鏈式儲存結構

1.棧的定義:

在表尾進行插入和刪除操作的線性表(仍然滿足線性表的操作,只是在push和pop有些區別)

棧頂(top)允許插入和刪除,另一端稱棧底(bottom),不含任何資料元素的棧叫空棧。

棧:後進先出(last in first out)的線性表,簡稱LIFO結構。

棧的插入稱為進棧,也稱壓棧,入棧。

棧的刪除稱為出棧,也稱彈棧。

2.棧的抽象資料結構

  因為棧本身就是一個線性表,所以線性表的操作特性它都具備,針對它的特殊性,在它的操作上可能會有一些變化。將進棧和出棧分別改名為push和pop。由於棧本身是一個線性表,所以線性表的順序儲存結構和鏈式儲存結構同樣適用於棧。

3.棧的順序儲存結構

棧的順序儲存結構,簡稱順序棧。定義一個top變數來指示棧定元素在陣列中的位置。若儲存棧的長度為StackSize,則棧頂位置top必需小於StackSize。下標從0開始,當棧存在一個元素時候,top 等於 0 ,當棧為空棧時候,top 等於 -1。

棧的結構定義

 typedef int SElemType;
    typedef struct {
        SElemType data[MAXSIZE];
        int top;                //用於棧頂指標
    } SqStack;

 

若現在有一個棧,StackSize為5,則普通棧、空棧、滿棧的情況如下圖所示。                                    

4.進棧

status pushStack(stack* s ,SElemType e)
{
	if(s->top == MaxSize - 1 )
		exit(error);
	s->top++;
	s->data[s->top] = e;
	//s->top++;
	return OK;
}

5.出棧

status popStack(stack* s )
{
	if(s->top == -1)
		exit(error);
	s->top--; //出棧並不是把這個元素改為0才可以。

}
//棧的順序儲存結構
#include<iostream>
#define MaxSize 10
#define OK 1 
#define error -1
using namespace std;
typedef int SElemType;
typedef int status;
typedef struct
{
	SElemType data[MaxSize];
	int top;
}stack;
//兩棧共享空間
typedef struct
{
	SElemType data[MaxSize];
	int top1;
	int top2;
}DoubleStack;
stack* creatStack()
{
	stack *stack1 = (stack*)malloc(sizeof(stack));
	stack1->top = -1;
	return stack1;
}
status pushStack(stack* s ,SElemType e)
{
	if(s->top == MaxSize - 1 )
		exit(error);
	s->top++;
	s->data[s->top] = e;
	//s->top++;
	return OK;
}
status popStack(stack* s )
{
	if(s->top == -1)
		exit(error);
	s->top--; //出棧並不是把這個元素改為0才可以。
}
void printStack(stack* s)
{
	while(s->top != -1)
	{
		//s->data 是棧的首地址
		cout<<s->data[s->top]<<endl;
		s->top--;
	}
}
//兩棧共享空間
status pushDoubleStack(DoubleStack *s ,SElemType num ,SElemType insertStack)
{
	if(s->top1 + 1 == s->top2)
		return error;
	if(insertStack!= 1&&insertStack != 2 )
		return error;
	if(insertStack == 1)
		s->data[++s->top1] = num;
	else if (insertStack == 2)
		s->data[--s->top2] = num;
	return OK
} //--和 ->運算等級

status popDoubleStack(DoubleStack *s ,SElemType* e  ,SElemType deleteStack) 
	//SElemType* e 來接受出棧的值  deleteStack從棧1 或者棧2 刪除
{
	
	if(deleteStack == 1)
	{
		//首先進行判斷空處理 
		if(s->top1 == -1)
			return error;
		*e = s->data[s->top1++];
	}
	else if(deleteStack == 2)
	{
		if(s->top2 == MaxSize)
			return error;
		*e = s->data[s->top2--];
	}
	return OK;

}
void main()
{
	stack *s = creatStack();
	pushStack(  s ,5 );
	printStack(s);

}

棧的鏈式儲存結構稱做鏈棧。

鏈棧空的定義top == NULL

進棧操作

status pushStackLinkList(StackLinkList* s,eleType e)
{
	Stacknode* p = (Stacknode*)malloc(sizeof(Stacknode));
	p->data = e;
	p->next = s->top;
	s->top = p;
	s->count++;
	return OK;
}

出棧操作

status popStackLinkList(StackLinkList* s,eleType* e)
{
	//判斷空處理
	if(s->top == NULL)
		return error;
	*e = s->top->data;
	Stacknode* p = s->top;
	s->top = s->top->next;
	free(p);
	s->count--;
	return OK;

}

棧的應用 ---遞迴!(沒有寫程式碼)