貼代碼:
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;