程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話棧的表現與完成實例詳解

C說話棧的表現與完成實例詳解

編輯:關於C++

C說話棧的表現與完成實例詳解。本站提示廣大學習愛好者:(C說話棧的表現與完成實例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話棧的表現與完成實例詳解正文


1.根本概念:

C說話的棧是指限制僅在表尾停止拔出和刪除操作的線性表。
棧作為C說話中一種經常使用的數據構造,是一種只能在一端停止拔出和刪除操作的特別線性表。它依照先輩後出的准繩存儲數據,先輩入的數據被壓入棧底,最初的數據在棧頂,須要讀數據的時刻從棧頂開端彈出數據(最初一個數據被第一個讀出來)。棧具有記憶感化,對棧的拔出與刪除操作中,不須要轉變棧底指針。

棧是許可在統一端停止拔出和刪除操作的特別線性表。許可停止拔出和刪除操作的一端稱為棧頂(top),另外一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。拔出普通稱為進棧(PUSH),刪除則稱為退棧(POP)。棧也稱為落後先出表。

在盤算機體系中,棧則是一個具有以上屬性的靜態內存區域。法式可以將數據壓入棧中,也能夠將數據從棧頂彈出。在i386機械中,棧頂由稱為esp的存放器停止定位。壓棧的操作使得棧頂的地址減小,彈出的操作使得棧頂的地址增年夜。

棧在法式的運轉中有著無足輕重的感化。最主要的是棧保留了一個函數挪用時所須要的保護信息,這經常稱之為客棧幀或許運動記載。客棧幀普通包括以下幾方面的信息:

(1)函數的前往地址和參數
(2)暫時變量:包含函數的非靜態部分變量和編譯器主動生成的其他暫時變量

2.完成代碼:

#define STACK_INIT_SIZE 10 /* 存儲空間初始分派量 */
 #define STACKINCREMENT 2 /* 存儲空間分派增量 */
 typedef struct SqStack
 {
  SElemType *base; /* 在棧結構之前和燒毀以後,base的值為NULL */
  SElemType *top; /* 棧頂指針 */
  int stacksize; /* 以後已分派的存儲空間,以元素為單元 */
 }SqStack; /* 次序棧 */
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;
 }
 Status DestroyStack(SqStack *S)
 { /* 燒毀棧S,S不再存在 */
  free((*S).base);
  (*S).base=NULL;
  (*S).top=NULL;
  (*S).stacksize=0;
  return OK;
 }
 Status ClearStack(SqStack *S)
 { /* 把S置為空棧 */
  (*S).top=(*S).base;
  return OK;
 }
 Status StackEmpty(SqStack S)
 { /* 若棧S為空棧,則前往TRUE,不然前往FALSE */
  if(S.top==S.base)
   return TRUE;
  else
   return FALSE;
 }
 int StackLength(SqStack S)
 { /* 前往S的元素個數,即棧的長度 */
  return S.top-S.base;
 }
 Status GetTop(SqStack S,SElemType *e)
 { /* 若棧不空,則用e前往S的棧頂元素,並前往OK;不然前往ERROR */
  if(S.top>S.base)
  {
   *e=*(S.top-1);
   return OK;
  }
  else
   return ERROR;
 }
 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;
  return OK;
 }
 Status Pop(SqStack *S,SElemType *e)
 { /* 若棧不空,則刪除S的棧頂元素,用e前往其值,並前往OK;不然前往ERROR */
  if((*S).top==(*S).base)
   return ERROR;
  *e=*--(*S).top;
  return OK;
 }
 Status StackTraverse(SqStack S,Status(*visit)(SElemType))
 { /* 從棧底到棧頂順次對棧中每一個元素挪用函數visit()。 */
  /* 一旦visit()掉敗,則操作掉敗 */
  while(S.top>S.base)
   visit(*S.base++);
  printf("\n");
  return OK;
 }
 #include"c1.h"
 typedef int SElemType; /* 界說棧元素類型,此句要在c3-1.h的後面 */
 #include"c3-1.h"
 #include"bo3-1.c"
 Status visit(SElemType c)
 {
  printf("%d ",c);
  return OK;
 }
 void main()
 {
  int j;
  SqStack s;
  SElemType e;
  if(InitStack(&s)==OK)
   for(j=1;j<=12;j++)
    Push(&s,j);
  printf("棧中元素順次為:");
  StackTraverse(s,visit);
  Pop(&s,&e);
  printf("彈出的棧頂元素 e=%d\n",e);
  printf("棧空否:%d(1:空 0:否)\n",StackEmpty(s));
  GetTop(s,&e);
  printf("棧頂元素 e=%d 棧的長度為%d\n",e,StackLength(s));
  ClearStack(&s);
  printf("清空棧後,棧空否:%d(1:空 0:否)\n",StackEmpty(s));
  DestroyStack(&s);
  printf("燒毀棧後,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);
 }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved