栈(1)---栈的基本定义

一:栈的类型定义:

  1.相关概念:

         (1)定义:只能在表的一端进行插入和删除的一种线性表

         (2)存储结构:用顺序栈或链栈存储均可,但以顺序栈更常见

         (3)运算规则:只能在栈顶运算,且访问结点时依照后进先出(LIFO)的原则

         与线性表的区别:

         

二:栈的表示和实现

*顺序栈

1.定义          

#define STACK_INIT_SIZE 100;           // 存储空间初始分配量
#define STACKINCREMENT 10;          // 存储空间分配增量
typedef struct {
  SElemType *base;    // base的初值为NULL,表明栈结构不存在
  SElemType *top;      // 栈顶指针,初值指向栈底,
                                   // 即top=base作为栈空的标记
  int stacksize;            // 当前已分存储空间,即指示当前栈
                                   // 可使用的最大容量,以元素为单位
} SqStack;    
2.基本操作:

(1)建栈

Status InitStack(SqStack &s) { //构造一个空栈S
  s.base=(SElemType * )malloc(STACK_INIT_SIZE 
                                                    * sizeof(SElemtype));
  If (!s.base) exit (OVERFLOW); //存储分配失败
  s.top=s.base;
  s.stacksize= STACK_INIT_SIZE;
  return OK;
} // InitStack;
(2)取栈顶元素:

Status  GetTop(SqStack s, SElemtype &e)  {
//若栈不空,用e返回S的栈顶元素
  if (s.top = = s.base) return  ERROR;
  e = * (s.top - 1);  
   //操作后s.top不变,并将当前栈顶元素赋给e 
  return OK;
} // GetTop;
//等同于删除栈顶元素(出栈),区别在于:
  e = * - - s.top;  
  //操作后stop减1,并将当前出栈的元素赋给e
(3)插入元素(入栈):

Status  Push(Sqstack & s, SElemType e) {
//插入元素e为新的栈顶元素
  if (s.top - s.base >= s.stacksize) {  
    //栈满,追加存储空间
    s.base=(SElemtype *)realloc(s.base, s.stacksize +
          STACKINCREMENT)  * sizeof( Selemtype ));
     if (!s.base) exit (OVERFLOW);  //存储分配失败
     s.top = s.base + s.stacksize;
     s.stacksize += STACKINCREMENT; 
  }
  * s.top ++ = e; 
    //*s.top =e;   s.top++;栈顶指针始终在栈顶元素的下一个位置
  return OK;
}  // Push;
(4)删除栈顶元素(出栈):

Status  Pop(SqStack & s, SElemType &e)  {
// 若栈不空,删除S的栈顶元素,用e返回其
// 值 ,并返回0K,否则返回ERROR
         if (s.top = = s.base) return (ERROR);
         e = * - - s.top;        
 //--s.top; e=*stop;栈顶指针始终在栈顶元素的下一位置
         return OK;
    } // Pop;


*链栈

1.定义:

栈的链式存储结构称为链栈,它是运算是受限的单链表,插入和删除操作仅限制在表头位置上进行。由于只能在表头进行操作,故没必要附加头结点,栈顶指针就是链表的头指针。

存储结构定义:

typedef  struct  StackNode{
     ElemType  data
     struct StackNode *next
  }StackNode;
  typedef  struct  {
     StackNode *top
  } LinkStack;


2.基本操作:

(1)初始化:

Void InitStack(LinkStack *s){ //初始化链栈
     s–>top=null;  }
(2)查询栈顶元素:

ElemType Gettop(LinkStack *s){ //返回栈顶元素
     if(StackEmpty(s)) return (ERROR);
     return s–>top–>data;  }

(3)插入栈顶(入栈)

Status Push(LinkStack *s, ElemType e) {
    //插入元素e为新的栈顶元素
   q=(StackNode*)malloc(sizeof(StackNode));
   q–>data=e;   
   q–>next=s–>top;
   s–>top=q;
 }
(4)删除栈顶元素(出栈)

Status  Pop( LinkStack  *s, ElemType &e) {
//若栈不空,则删除链栈栈顶元素,用e返回其值
    if (StackEmpty(s)  return (Error);
    q=s–>top;
    e=q–>data;
    s–>top=q–>next;
    free(q);
    return OK;
 }



      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值