栈,顺序栈,链栈

        栈作为一种限定性线性表,是将表的插入删除限制为仅在表的一端进行,通常将表中允许插入删除的一端叫做栈顶(top),因此栈顶的当前位置是动态变化的。栈的另一端叫做栈底(bottom)。当栈中没有元素时称为空栈。插入操作称为进栈或入栈,删除操作称为出栈或退栈。栈是先进后出的线性表,简称为LIFO表。
        栈主要有两种基本的存储结构:顺序存储结构和链式存储结构。简称顺序存储的栈为顺序栈,链式存储的栈为链栈。

顺序栈

    存储结构

#define Stack_Size 50
typedef struct{
	StackElementType elem[Stack_Size];
	int top; 
}SeqStack;

        1.初始化

void InitStack(SeqStack *S) {
	S->top = -1;
}

        2.进栈

int Push(SeqStack *S, StackElementType x) {
	if(S->top == Stack_Size-1)
	    return FALSE;
	S->top++;
	S->elem[S->top] = x;
	return TRUE; 	
}

        3.出栈

int Pop(SeqStack *S, StackElementType *x){
	if(S->top == -1)
		return FALSE;
	else {
		*x = S->elem[S->top];
		S->top--;
		return TRUE; 
	}
}

        3.读栈顶元素

int GetTop(SeqStack *S, StackElementType *x){
	if(S->top == -1)
		return FALSE;
	else {
		*x = S->elem[S->top];
		return TRUE; 
	}
}

链栈

    存储结构

typedef struct node{
	StackElementType data;
	struct node *next; 
}LinkStackNode;
typedef LinkStackNode *LinkStack; 

        1.初始化

void InitStack(LinkStack *S) {
	S->next = NULL;
}

        2.进栈

int Push(LinkStack top, StackElementType x) {
	LinkStackNode *temp;
	temp = (LinkSatckNode*)malloc(sizeof(LinkStackNode));
	if(temp == NULL)
		return FALSE;
	temp->data = x;
	temp->next = top->next;
	top->next = temp;
	return TRUE; 	
}

        3.出栈

int Pop(LinkStack top, StackElementType *x){
	LinkStackNode *temp;
	temp = top->next;
	if(temp == NULL)
		return FALSE;
	top->next = temp->next;
	*x = temp->data;
	free(temp);
	return TRUE; 
} 

你可能感兴趣的:(数据结构)