C语言,简单栈的实现 Stack

/*implement a stack in c*/
#define STACK_INIT_SIZE 10
#define STACK_INCREMENT 2

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int ElemType;
typedef int Status;

typedef struct SqStack{
    ElemType *base;
    ElemType *top;
    int stackSize;
}SqStack;


//traverse the stack from base to top
void print(SqStack *s){
    assert(s);
    ElemType *elem = s->base;
    if(s->base == s->top){
	printf("This is an empty stack!\n");
    }
    for(elem ; elem != s->top ; elem++){
	printf("element is %d", *elem);
	printf("\n");
    }
    
}

//init statck 
SqStack* InitStack(SqStack *s){
    s = (SqStack*)malloc(sizeof(SqStack));
    if(!s)
	exit(0);
    s->base = (ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
    s->top = s->base;
    s->stackSize = STACK_INIT_SIZE;
    printf("Init stack successfully!\n");
    return s;
} 

//free stack
Status FreeStack(SqStack *s){
    if(!s){
	printf("Stack is null no need to free!\n");
	return 0;
    }else{
	free(s->base);
   	free(s);
	return 1;
    }
}


//push element into stack
Status Push(SqStack *s, ElemType e){
    assert(s);
    //stack is full, need more space
    if(s->top - s->base >= s->stackSize){
	s->base = (ElemType*)realloc(s->base, (s->stackSize + STACK_INCREMENT)*sizeof(ElemType));
        if(!s->base){
	    printf("realloc failed!\n");
	    exit(1);
	}
	s->top = s->base + s->stackSize;
 	s->stackSize += STACK_INCREMENT;
    }
	*(s->top) = e;
	++(s->top);
	return 1;
}

//pop out elem from stack
Status Pop(SqStack *s, ElemType *e){
    assert(s);
    if(s->base == s->top){
	printf("It's a empty stack\n");
	return 0;
    }
    e = s->top;
    --(s->top);
    return 1;
}


void main(){
    int i;
    SqStack *s;
    s = InitStack(s);
    for(i = 0 ; i < 20 ; i++){
        int elem = rand()%100;
	Push(s,elem);
    }
    print(s);
    FreeStack(s);
}

        这是一个简单栈的实现,我是菜鸟写的不好,大家轻拍。我写在空间里的文章,都是抱着学习的态度来的,把自己的想法写下来,如果哪位大牛看出了问题,我是非常乐意求教的。

         Thank you all!


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是使用实现简单计算器的 C 语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> // 定义结构体 typedef struct stack { int top; int capacity; int *array; } Stack; // 创建 Stack *createStack(int capacity) { Stack *stack = (Stack *) malloc(sizeof(Stack)); stack->top = -1; stack->capacity = capacity; stack->array = (int *) malloc(capacity * sizeof(int)); return stack; } // 判断是否为空 int isEmpty(Stack *stack) { return stack->top == -1; } // 判断是否已满 int isFull(Stack *stack) { return stack->top == stack->capacity - 1; } // 入 void push(Stack *stack, int item) { if (isFull(stack)) { printf("已满,无法入\n"); return; } stack->array[++stack->top] = item; } // 出 int pop(Stack *stack) { if (isEmpty(stack)) { printf("为空,无法出\n"); return -1; } return stack->array[stack->top--]; } // 获取顶元素 int peek(Stack *stack) { if (isEmpty(stack)) { printf("为空\n"); return -1; } return stack->array[stack->top]; } // 计算两个数字的结果 int calculate(int num1, int num2, char op) { switch (op) { case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': return num1 / num2; default: printf("非法操作符\n"); return 0; } } // 计算表达式的值 int evaluate(char *exp) { Stack *stack = createStack(strlen(exp)); int i, num = 0; for (i = 0; exp[i] != '\0'; i++) { if (isdigit(exp[i])) { num = num * 10 + (exp[i] - '0'); } else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') { push(stack, num); num = 0; int num1 = pop(stack); int num2 = pop(stack); push(stack, calculate(num2, num1, exp[i])); } else if (exp[i] == ' ') { continue; } else { printf("非法字符\n"); return 0; } } return pop(stack); } // 测试代码 int main() { char exp[100]; printf("请输入表达式:\n"); fgets(exp, 100, stdin); printf("计算结果为:%d\n", evaluate(exp)); return 0; } ``` 这个简单计算器实现了四则运算,支持多位数字和空格,但不支持负数和括号。可以通过输入表达式来计算表达式的值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值