小白算法積累——棧2#共享棧+棧頂相向+迎面增長

題目:設有兩個棧s1,s2都採用順序棧方式,並共享一個存儲區[0,…,maxsize-1],爲了儘量利用空間,減少溢出的可能,可採用棧頂相向、迎面增長的存儲方式。試設計s1,s2,有關入棧和出棧的操作算法。
關鍵字:共享棧+棧頂相向+迎面增長

思路
兩個棧共享向量空間,將兩個棧的棧底設在向量兩端,
初始時,s1棧頂指針爲-1,s2棧頂指針爲maxsize。
兩個棧頂指針相鄰時爲棧滿。
兩個棧頂相向、迎面增長,棧頂指針指向棧頂元素。

初始化共享棧:

# define maxsize 100//兩個棧共享順序存儲空間所能達到的最多元素數/最大容量,初始化100
# define elemtp int//假設元素類型爲整形
typedef struct{
   elemtp stack[maxsize];//棧空間
   int top[2];//top爲兩個棧頂指針
  }stk;//stack的縮寫
  stk  s;//s是如上定義的結構類型變量,爲全局變量

本題關鍵:
兩個棧入棧和退棧時的棧頂指針的計算。
s1(top=-1)棧是通常意義下的棧;

s2(top=maxsize)棧入棧操作時,其棧頂指針左移(減1);
退棧時,棧頂指針右移(加1)

此外,對於所有棧的操作,都要注意“入棧判滿,出棧判空”

1)入棧操作
int push(int i,elemtp  x){
//入棧操作。i爲棧號,i=0表示左邊(下邊)的s1棧,i=1表示右邊(上邊)的s2棧,x是入棧元素
//入棧成功返回1,否則返回 0
   if(i<0||i>1){
       printf("棧號輸入不對");
       exit(0);
   }
   if(s.top[1]-s.top[0]==1){
      printf("棧已滿\n")
      return 0;
      }
      switch(i){
         case 0:s.stack[++s.top[0]]=x;return 1;break;
         case 1:s.stack[--s.top[1]]=x;return 1;
      }
    }2)退棧操作
 elemtp pop(int i){//退棧算法。i代表棧號,i=0時爲s1棧,i=1時爲s2棧。退棧成功返回退棧元素,否則返回-1
    if(i<0||i>1){
        printf("棧號輸入錯誤\n")
        exit(0);
    }
    switch(i){
       case 0:
          if(s.top[0]==-1){
               printf("棧空\n");
               return -1;
          }
          else
              return s.stack[s.top[0]--];
       case 1:
          if(s.top[1]==maxsize){
              printf("棧空\n");
              return -1;
          }
          else
             return s.stack[s.top[1]++];
        }//switch
     }
          
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章