a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > C > 正文

淺析順序結(jié)構(gòu)存儲(chǔ)的棧

2020-01-26 15:38:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

棧定義:僅限在表尾進(jìn)行插入和刪除的線性表

棧的特點(diǎn):

1)一般來(lái)說(shuō)能在表尾進(jìn)行進(jìn)棧和出棧的數(shù)據(jù)

2)先進(jìn)后出(last in first out )

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

操作系統(tǒng)一般會(huì)在內(nèi)存劃出一塊,專門用于棧操作,當(dāng)然這個(gè)跟普通的操作有些區(qū)別:比如存放數(shù)組,地址是增加的;但是在存入數(shù)據(jù)到棧,地址則是不斷減小的

棧的存儲(chǔ)結(jié)構(gòu):

復(fù)制代碼 代碼如下:

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

數(shù)據(jù)定義:

復(fù)制代碼 代碼如下:

//默認(rèn)的存儲(chǔ)空間的大小和空間增長(zhǎng)大小
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10

//存儲(chǔ)數(shù)據(jù)的類型定義
#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

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

復(fù)制代碼 代碼如下:

//初始化棧
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;
}

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

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

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

復(fù)制代碼 代碼如下:

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
進(jìn)棧:

復(fù)制代碼 代碼如下:

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;
}

如果棧的大小大于已分配長(zhǎng)度,重新分配空間,并使棧頂重新指向新的位置,之后就將數(shù)據(jù)存入當(dāng)前棧頂指向的位置,然后棧頂+1
出棧:

復(fù)制代碼 代碼如下:

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

 return 0;
}

首先將棧頂位置-1,然后取得當(dāng)前位置的值
以下為輔助函數(shù),如下:

復(fù)制代碼 代碼如下:

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

復(fù)制代碼 代碼如下:

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

 return S.stacksize;
}


復(fù)制代碼 代碼如下:

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

 return 0;
}

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 亚洲欧美v国产一区二区 | 国产网站视频 | 天天舔天天干 | 国产精品美女久久久久aⅴ国产馆 | 国产一区| 欧美成人精品一区二区男人小说 | 免费的一级黄色片 | 久久无码精品一区二区三区 | 米奇av | 久久密 | 日韩精品小视频 | 91综合网 | 久久久久久亚洲 | 美女操网站| 精品国产乱码久久久久久影片 | 99精品网站 | 日本久久精品视频 | 亚洲一区成人 | 亚洲精品午夜国产va久久成人 | 青青草99| 在线视频一区二区 | 黄色国产一级视频 | 国产精品久久久久无码av | 精品一区二区三区日本 | 成人高清网站 | 五月天最新网址 | 亚欧色视频 | 毛片网页| 亚洲国产精品自拍 | 国产精品自产av一区二区三区 | 国产伦精品一区二区三区电影 | 久久99精品久久久久久琪琪 | 91精品国产综合久久久久久蜜臀 | 国产一区在线免费 | 视频精品一区 | 黄色一级毛片 | 亚洲精品中文视频 | 一本一本久久a久久精品牛牛影视 | 日韩精品在线电影 | av午夜电影 | 欧美三级网|