C语言实现栈的基本操作(附二进制转十进制操作)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define SUCCESS 1
#define OVER 0
typedef char ElemType;
typedef int Statue;
typedef struct sqStack
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
Statue InitStack(sqStack *s);
Statue pushStack(sqStack *s, ElemType e);
Statue pullStack(sqStack *s, ElemType *pushdata);
void clearStack(sqStack *s);
Statue DestoryStack(sqStack *s);
int StackLen(sqStack *s);
int binaryToDec(sqStack *s);
int main(void){
int i;
sqStack *stack;
sqStack *otcStack;
char data[4] = {'0', '0', '1', '1'};
InitStack(stack);
InitStack(otcStack);
printf("进栈顺序为:");
for(i = 0; i < 4; i++){
printf("%4c", data[i]);
pushStack(stack, data[i]);
}
printf("\n\n");
printf("二进制转十进制数后为:%d", binaryToDec(stack));
return 0;
}
Statue InitStack(sqStack *s){
s->base = (ElemType *) malloc (STACK_INIT_SIZE * (sizeof(ElemType)));
if( !(s->base) ){
exit(ERROR);
}
s->top = s->base;
s->stackSize = STACK_INIT_SIZE;
return SUCCESS;
}
Statue pushStack(sqStack *s, ElemType e){
if( s->top - s->base >= s->stackSize){
s->base = (ElemType *) realloc (s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if( !(s->base) ){
exit(ERROR);
}
s->top = s->base + s->stackSize;
s->stackSize += STACKINCREMENT;
}
*(s->top) = e;
s->top++;
return SUCCESS;
}
Statue pullStack(sqStack *s, ElemType *pushData){
--(s->top);
*pushData = *(s->top);
return SUCCESS;
}
void clearStack(sqStack *s){
s->top = s->base;
}
Statue DestoryStack(sqStack *s){
int i, len;
len = s->stackSize;
for(i = 0; i < len; i++){
free(s->base);
s->base++;
}
s->base = s->top = NULL;
s->stackSize = 0;
return SUCCESS;
}
int StackLen(sqStack *s){
return(s->top - s->base);
}
int binaryToDec(sqStack *s){
char data;
int i, sum = 0;
int num = StackLen(s);
for(i = 0; i < num; i++){
pullStack(s, &data);
sum = sum + (data - 48) * pow(2, i);
}
return sum;
}