zoukankan      html  css  js  c++  java
  • 栈的定义与特点

    定义:栈是仅限定在表尾进行插入或删除的线性表。
    栈顶:表尾端。栈头:表头端。
    特点:后进先出(Last In First Out,LIFO)。

    栈的表示操作和实现

    栈的类型定义

    抽线数据类型定义:

    ADT Stack{
    
    	数据对象:D={ai|ai∈Element,i=1,2,...,n,n>=0)
    	数据关系:R={<ai-1,ai>|ai-1,ai∈D,i=2,...,n}
    			 约定an为栈顶,ai为栈底。
    	基本操作:
    	InitStack(&S)
    	构造一个空栈
    	DestroyStack(&S)
    	初始条件:栈S以存在
    	造作结果:栈S被销毁
    	ClearStack(&S)
    	初始条件:栈S以存在
    	造作结果:将S清为空栈
    	StackEmpty(&S)
    	初始条件:栈S以存在
    	造作结果:若S为空栈,返回true,否则返回false
    	StackLength(S)
    	初始条件:栈S以存在
    	造作结果:返回S的元素个数,即栈的长度
    	GetTop(S)
    	初始条件:栈S以存在且非空
    	造作结果:返回S的栈顶元素,不修改栈顶指针
    	Push(&S,e)
    	初始条件:栈S以存在且非空
    	造作结果:插入元素e为新的栈顶元素
    	Pop(&S,e)
    	初始条件:栈S以存在且非空
    	造作结果:删除S的栈顶元素,并用e返回其值
    	StackTraverse(S)
    	初始条件:栈S以存在且非空
    	造作结果:从栈顶到栈底依次对S的每个元素进行访问
    	
    }ADT Stack
    

    顺序栈的表示和实现

    储存结构

    #define MAXSIZE 100
    typedef struct{
    	SElemType *base;//栈底指针
    	SElemType *top;//栈顶指针
    	int stacksize;//栈可用的最大容量
    }SqStack;
    

    base为栈底指针,始终指向栈底,base值为NULL,表示栈结构不存在。
    top为栈顶指针,其初值指向栈底,插入新的栈顶元素时,指针top加1,删除时,top减一。
    栈空时,base == top,栈非空时,top始终指向栈顶元素的上一位置。

    初始化

    Status InitStack(SqStack &S){
    	S.base = new SElemType[MAXSIZE];
    	if(!S.base)
    		return ERROR;	
    	S.base = S.top;
    	S.stacksieze = MAXSIZE;
    	return OK;
    }
    

    销毁

    Status DestroyStack(SqStack &S){
    	if(S.base){
    		delete S.base;
    		S.stacksize = 0;
    		S.base = S.top = NULL;
    	}
    	return OK;
    }
    

    清空

    Status ClearStack(&S){
    	if(S.base == NULL) {
    		cout<<"顺序栈不存在!"<<endl;
    		return FALSE;
    	} else {
    		while(S.top != S.base) {
    			*(S.top)  = 0;
    			S.top--;
    		}
    		*(S.base) = 0;
    		cout<<"清空成功!"<<endl;
    		return OK;
    	}
    }
    

    判空

    bool StackEmpty(SqStack S){
    	if(S.base==S.top)
    		return true;
    	else
    		return false;
    }
    

    求栈长(栈中元素的个数)

    int StackLength(SqStack S){
    	return S.top - S.base;
    }
    
    

    取栈顶元素

    SElemType Gettop(SqStack S){
    	if(S.top != S.base)
    		return  *(S.top-1);
    }
    

    入栈

    Status Push(SqStack &S,SElemType e){
    	if((S.top - S.base) == MAXSIZE )
    		return ERROR;
    	*S.top++ = e;
    	return OK;
    }
    

    出栈

    Status Pop(SqStack &S,SElemType &e){
    	if(S.base == S.top)
    		return ERROR;
    	e = *S.top--;
    	return OK;
    }
    

    遍历

    Status StackTraverse(SqStack S){
    	SqStack *p;
    	p = S.base;
    	whlie(p != S.top ){
    		p++;
    	}
    	return OK;
    }
    

    链式栈的表示和实现

    储存结构

    typedef struct StackNode{
    	SElemType data;
    	struct StackNode *next;
    }StackNode,*LinkStack;
    

    初始化

    Status InitStack(LinkStack &S){
    	S = NULL;
    	return OK;
    }
    

    销毁

    Status DestroyStack(LinkStack &S){
    		if(S == NULL)
    			return ERROR;
    		StackNode *p;
        	while(S!= NULL)
       		 {   
           	 	p = S;
           	 	S = S->next;
           	 	delete p;
        	}   
        	return OK;
    }
    

    清空

    Status ClearStack(LinkStack &S){
    	if(S == NULL)
    		return ERROR;
    	StackNode *p;
        while(*S){   
           	p = S;
           	S = S->next;
           	delete p;
        }
        *S = NULL; 
        return OK;
    
    }
    

    判空

    bool StackEmpty(&S){
    	if(S == NULL)
    		return true;
    	else
    		return false;
    }
    

    求栈长(栈中元素的个数)

    int StackLength(LinkStack S){
    	int i = 0;
    	whlie(S != NULL){
    		S = S->next;
    		i++;
    	}
    	return i;
    }
    
    

    取栈顶元素

    SElemType Gettop(LinkStack S){
    	if(S)
    		return S->data;
    }
    

    入栈

    Status Push(LinkStack &S,SElemType e){
    	StackNode *p = new StackNode;
    	p->data = e;
    	p->next = S;
    	S = p;
    	return OK;
    }
    

    出栈

    Status Pop(LinkStack &S,SElemType &e){
    	if(S == NULL)
    		return ERROR;
    	e = S->data;
    	StackNode *p;
    	p = S;
    	S = S->next;
    	delete p;
    	return OK;
    }
    

    遍历

    Status StackTraverse(LinkStack S){
    	while(S != NULL){
    		S=S->next;
    	}
    	return OK;
    }
    
  • 相关阅读:
    图灵2010.05书讯
    上海.NET技术交流会
    图灵2010.07书讯
    高效模式编写者的7个习惯
    QRCode 二维码开源DLL
    javascript 复习
    关于反射技术
    数字签名与加密解密
    使用负载均衡技术建设高负载的网络站点
    dreamweaver cs5.5中的phonegap升级测试
  • 原文地址:https://www.cnblogs.com/thrseven/p/15196245.html
Copyright © 2011-2022 走看看