国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

淺析順序結構存儲的棧

2020-01-26 15:38:26
字體:
來源:轉載
供稿:網友

棧定義:僅限在表尾進行插入和刪除的線性表

棧的特點:

1)一般來說能在表尾進行進棧和出棧的數據

2)先進后出(last in first out )

3)棧會有棧頂,棧底,通常棧底為高地址,棧頂為高地址,如下圖所示

操作系統一般會在內存劃出一塊,專門用于棧操作,當然這個跟普通的操作有些區別:比如存放數組,地址是增加的;但是在存入數據到棧,地址則是不斷減小的

棧的存儲結構:

復制代碼 代碼如下:

typedef struct _SQSTACK
{
 SElemType* base;
 SElemType* top;
 int stacksize;
}
SqStack;

數據定義:

復制代碼 代碼如下:

//默認的存儲空間的大小和空間增長大小
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10

//存儲數據的類型定義
#ifndef INT_TYPE
#define INT_TYPE
#endif // INT_TYPE

#ifdef INT_TYPE
typedef  int  SElemType;
#elif defined FLOAT_TYPE
typedef  float SElemType;
#elif defined STRING_TYPE
typedef  char* SElemType;
#elif defined STRUCT_TYPE
typedef  void* SElemType;
#endif

棧的操作,會涉及到初始化棧,銷毀棧,進棧(入棧),出棧,還有判斷棧空,棧大小,以及清空棧,如下:
棧的初始化:

復制代碼 代碼如下:

//初始化棧
int InitStack(SqStack *S)
{
 S->base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
 if (!S->base)
 {
  return -1;
 }
 S->top = S->base;
 S->stacksize = STACK_INIT_SIZE;
 return 0;
}

棧才初始化,里面還沒有數據,這時候top,base都指向分配空間的基地址,表示棧空
銷毀棧:
復制代碼 代碼如下:

//銷毀棧
int DestroyStack(SqStack *S)
{
 if (S->base)
 {
  free(S->base);
  S->base = NULL;
  S->top = NULL;
  S->stacksize = 0;
 }
 return 0;
}

如果棧存在,就銷毀地址空間,將棧尺寸置0
進棧:

復制代碼 代碼如下:

int Push(SqStack *S, const SElemType data)
{
 assert(S->base != NULL);
 if (S->top - S->base >= STACK_INIT_SIZE)
 {
  S->base = (SElemType*)realloc(S->base,
   (STACK_INIT_SIZE + STACK_INCREMENT) * sizeof(SElemType));
  if (!S->base)
  {
   return -1;
  }
  S->top = S->base + S->stacksize;
  S->stacksize += STACK_INCREMENT;
 }
 *S->top++ = data;

 return 0;
}

如果棧存在,就銷毀地址空間,將棧尺寸置0
進棧:

復制代碼 代碼如下:

int Push(SqStack *S, const SElemType data)
{
 assert(S->base != NULL);
 if (S->top - S->base >= STACK_INIT_SIZE)
 {
  S->base = (SElemType*)realloc(S->base,
   (STACK_INIT_SIZE + STACK_INCREMENT) * sizeof(SElemType));
  if (!S->base)
  {
   return -1;
  }
  S->top = S->base + S->stacksize;
  S->stacksize += STACK_INCREMENT;
 }
 *S->top++ = data;

 return 0;
}

如果棧的大小大于已分配長度,重新分配空間,并使棧頂重新指向新的位置,之后就將數據存入當前棧頂指向的位置,然后棧頂+1
出棧:

復制代碼 代碼如下:

//出棧
int Pop(SqStack *S, SElemType *data)
{
 assert(S->base != NULL);
 if (S->base == S->top)
 {
  return -1;
 }
 *data = *(--S->top);

 return 0;
}

首先將棧頂位置-1,然后取得當前位置的值
以下為輔助函數,如下:

復制代碼 代碼如下:

//棧是否為空
int IsStackEmpty(const SqStack &S)
{
 return ((S.base == S.top) ? true:false);
}

復制代碼 代碼如下:

//得到棧的長度
int GetStackLength(const SqStack &S)
{
 assert(S.base != NULL);

 return S.stacksize;
}


復制代碼 代碼如下:

//清空棧
int ClearStack(SqStack *S)
{
 assert(S->base != NULL);
 if (S->base != S->top)
 {
  S->top = S->base;
 }
 S->stacksize = 0;

 return 0;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 紫云| 虹口区| 抚宁县| 盐山县| 新兴县| 甘洛县| 嘉义市| 拉孜县| 郁南县| 邮箱| 鹤庆县| 宜君县| 永城市| 建宁县| 巴青县| 阜新| 无锡市| 石阡县| 渭源县| 从化市| 曲靖市| 惠水县| 治县。| 长岛县| 包头市| 宁晋县| 罗江县| 沙洋县| 莲花县| 巴楚县| 江津市| 如皋市| 南川市| 应用必备| 广丰县| 新宁县| 汶上县| 获嘉县| 阆中市| 伊金霍洛旗| 曲水县|