程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++編程范式棧的泛型寫法

C++編程范式棧的泛型寫法

編輯:C++入門知識

貼代碼:

 


stack.h


[cpp]
 struct   stack 

    void * elems;  
    int logicallen;  //當前棧空間中的元素個數  
    int allocalength;//棧空間的實際大小  
    int elemSize;//元素大小  
 
 
}; 

 struct   stack
{
 void * elems;
 int logicallen;  //當前棧空間中的元素個數
 int allocalength;//棧空間的實際大小
 int elemSize;//元素大小


};

stack.cpp


[cpp]
#include "stack.h"  
#include <iostream.h>  
#include<stdlib.h>  
#include "assert.h"  
#include "memory.h"  
/************************************************************************/ 
/*  創建一個棧空間                                                                      */ 
/************************************************************************/ 
void stackNew(stack *s,int elemSize){ 
 
    s->logicallen=0; 
    s->allocalength=4; 
    s->elems=(int *)malloc(4*elemSize); //申請棧空間  
}; 
/************************************************************************/ 
/* 釋放棧空間                                                                      */ 
/************************************************************************/ 
void stackDelete(stack *s){ 
    free(s); 
     
}; 
 
/************************************************************************/ 
/*        chuzhan                                                              */ 
/************************************************************************/ 
 
/************************************************************************/ 
/* 將元素elem入棧                                                                    */ 
/************************************************************************/ 
//   
// void stackPush(stack *s,void *add){  
//   
//  if(s->logicallen == s->allocalength){  
//      s->allocalength *=2; //等價於s->allocalength = s->allocalength*2  
//      s->elems = (int *)realloc(s->elems,s->allocalength*sizeof(int));  
//  }  
//  assert(s->elems != NULL);  
//  s->elems[s->logicallen] =value;  
//  s->logicallen++;  
// };  
 
void stackGrow(stack *s){ 
 
    s->allocalength*=2; 
    s->elems = realloc(s->elems,s->elemSize*s->allocalength); 
 

/************************************************************************/ 
/* 將元素elem入棧                                                                    */ 
/************************************************************************/ 
void stackPush(stack *s,void *elemAddr){ 
     
    if(s->logicallen == s->allocalength){ 
        stackGrow(s); //需要擴容了  
         
    } 
    //手動計算元素地址,因為void*類型,系統比不知道該怎麼處理。所以需要自己計算出入棧和出棧時元素的地址。  
    //從add地址下的內容拷貝到target的地址,拷貝長度為elemSize  
    void * target = (char *)s->elems+s->logicallen*s->elemSize; 
 
    memcpy(target,elemAddr,s->elemSize); 
 
 
    s->logicallen++; 
}; 
void main(){ 
     
     
int i=1; 
int j=2; 
int m = i+j*2; 
cout<<m<<endl; 
 
     
     

#include "stack.h"
#include <iostream.h>
#include<stdlib.h>
#include "assert.h"
#include "memory.h"
/************************************************************************/
/*  創建一個棧空間                                                                      */
/************************************************************************/
void stackNew(stack *s,int elemSize){

 s->logicallen=0;
 s->allocalength=4;
 s->elems=(int *)malloc(4*elemSize); //申請棧空間
};
/************************************************************************/
/* 釋放棧空間                                                                      */
/************************************************************************/
void stackDelete(stack *s){
 free(s);
 
};

/************************************************************************/
/*        chuzhan                                                              */
/************************************************************************/

/************************************************************************/
/* 將元素elem入棧                                                                    */
/************************************************************************/
//
// void stackPush(stack *s,void *add){
//
//  if(s->logicallen == s->allocalength){
//   s->allocalength *=2; //等價於s->allocalength = s->allocalength*2
//   s->elems = (int *)realloc(s->elems,s->allocalength*sizeof(int));
//  }
//  assert(s->elems != NULL);
//  s->elems[s->logicallen] =value;
//  s->logicallen++;
// };

void stackGrow(stack *s){

 s->allocalength*=2;
 s->elems = realloc(s->elems,s->elemSize*s->allocalength);

}
/************************************************************************/
/* 將元素elem入棧                                                                    */
/************************************************************************/
void stackPush(stack *s,void *elemAddr){
 
 if(s->logicallen == s->allocalength){
  stackGrow(s); //需要擴容了
  
 }
 //手動計算元素地址,因為void*類型,系統比不知道該怎麼處理。所以需要自己計算出入棧和出棧時元素的地址。
 //從add地址下的內容拷貝到target的地址,拷貝長度為elemSize
 void * target = (char *)s->elems+s->logicallen*s->elemSize;

 memcpy(target,elemAddr,s->elemSize);


 s->logicallen++;
};
void main(){
 
 
int i=1;
int j=2;
int m = i+j*2;
cout<<m<<endl;

 
 
}
總結:

下面這個方法就是獲得top的地址。入棧。

void * target = (char *)s->elems+s->logicallen*s->elemSize;

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved