C语言实现栈(基于数组)

栈是一种操作受限的数据结构,只允许从一段操作,而且先进后出(FILO  first in last out)这里将栈的操作封装在C语言的头文件里

实现栈的代码如下

 

#include<stdbool.h>
#define maxsize 10
typedef int datatype;

//Sequence Stack 实现顺序栈,使用数组来实现
struct stack
{
    datatype data[maxsize];
    int top;
};

typedef struct stack Stack;
//创建栈

Stack s;
//初始化栈
void init()
{
    s.top=-1;
}

//判断栈是否为空
bool Empty()
{
    if(s.top==-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//判断栈是否已满了
bool full()
{
    if(s.top==maxsize-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//入栈
void Push(datatype element)
{
    if(!full())
    {
        s.top++;
        s.data[s.top]=element;
    }
    else
    {
        printf("栈满\n");
    }
}

//出栈
void Pop()
{
    if(!Empty())
    {
        s.top--;
    }
    else
    {
        printf("栈空\n");
    }
}

//取栈顶元素
datatype Top()
{
    if(!Empty())
    {
        return s.data[s.top];
    }
    else
    {
        printf("栈空\n");
    }
}

//销毁栈
void Destroy()
{
    s.top=-1;
}

 

 

测试栈的代码如下:

 

 

 

#include<stdio.h>
#include "SequenceStack.h"
int main()
{
    int i=0;
    // struct stack s;
    //初始化栈
    printf("\n###########初始化栈###########\n");
    init();
    printf("----------------------------------");    
    //入栈操作
    printf("\n###########入栈操作###########\n");
    for(i=0;i<=10;i++)
    {
        Push(i);
    }
    printf("----------------------------------");
    printf("\n###########取栈顶元素###########\n");
    printf("%d\n",Top());
    printf("----------------------------------");    
    //出栈操作
    printf("\n###########出栈操作###########\n");
    for(i=0;i<=10;i++)
    {
        Pop();
    }  
    printf("----------------------------------");    
    printf("\n###########取栈顶元素###########\n");
    Top();
    printf("----------------------------------");
    printf("\n###########销毁栈###########\n"); 
    Push(10);
    Destroy();
    Top();
}

 

 

这样实现栈,宏定义处maxsize表示栈的大小,方便以后修改,typedef也是同样的效果,可以随时改变数据类型。

 

 

在操作栈的时候也只要用到push、pop、top、等方法就可以了

这样的栈有一个明显的缺点,是栈被定义在头文件里,这样使用者只能使用一个栈,无法同时建立两个栈,考虑到这一点,对栈的代码做出修改

实现栈的代码

 

#include<stdbool.h>
#define maxsize 10
typedef int datatype;

//Sequence Stack 实现顺序栈,使用数组来实现
struct stack
{
    datatype data[maxsize];
    int top;
};

typedef struct stack Stack;
//创建栈

// Stack s;
//初始化栈
void init(Stack *s)
{
    s->top=-1;
}

//判断栈是否为空
bool Empty(Stack *s)
{
    if(s->top==-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//判断栈是否已满了
bool full(Stack *s)
{
    if(s->top==maxsize-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//入栈
void Push(Stack *s,datatype element)
{
    if(!full(s))
    {
        s->top++;
        s->data[s->top]=element;
    }
    else
    {
        printf("栈满\n");
    }
}

//出栈
void Pop(Stack *s)
{
    if(!Empty(s))
    {
        s->top--;
    }
    else
    {
        printf("栈空\n");
    }
}

//取栈顶元素
datatype Top(Stack *s)
{
    if(!Empty(s))
    {
        return s->data[s->top];
    }
    else
    {
        printf("栈空\n");
    }
}

//销毁栈
void Destroy(Stack *s)
{
    s->top=-1;
}


测试栈的代码

 

#include<stdio.h>
#include "SequenceStack1.0.h"
int main()
{
    int i=0;
    Stack p; 
    Stack *s;
    s=&p;
    // struct stack s;
    //初始化栈
    printf("\n###########初始化栈###########\n");
    init(s);
    printf("----------------------------------");    
    //入栈操作
    printf("\n###########入栈操作###########\n");
    for(i=0;i<=10;i++)
    {
        Push(s,i);
    }
    printf("----------------------------------");
    //取栈顶元素
    printf("\n###########取栈顶元素###########\n");
    printf("%d\n",Top(s));
    printf("----------------------------------");    
    //出栈操作
    printf("\n###########出栈操作###########\n");
    for(i=0;i<=12;i++)
    {
        Pop(s);
    }  
    printf("----------------------------------");
    //取栈顶元素    
    printf("\n###########取栈顶元素###########\n");
    Top(s);
    printf("----------------------------------");
    //销毁栈
    printf("\n###########销毁栈###########\n"); 
    Push(s,10);
    Destroy(s);
    Top(s);
}

 

这里可以在主函数中自己定义栈,从而同时实现多个栈,但是这样的栈还是大小固定的,每次修改maxsize很麻烦,所以想到malloc函数,对栈的代码做了进一步的修改

 

实现栈的代码

 

#include<stdbool.h>
#include<stdlib.h>
#define maxsize 10
typedef int datatype;

//Sequence Stack 实现顺序栈,使用数组来实现
struct stack
{
    datatype *data;
    int top;
};

typedef struct stack Stack;
//创建栈

int realsize=maxsize;

// Stack s;
//初始化栈
void init(Stack *s)
{
    s->data = (datatype *)malloc(sizeof(datatype)*maxsize);
    s->top=-1;
}

//判断栈是否为空
bool Empty(Stack *s)
{
    if(s->top==-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//判断栈是否已满了
void full(Stack *s)
{
    if(s->top==realsize-1)
    {
        realsize++;
        s->data=(datatype *)realloc(s->data,realsize*sizeof(datatype));
    }
}

//入栈
void Push(Stack *s,datatype element)
{
    full(s);
    s->top++;
    s->data[s->top]=element;
}

//出栈
void Pop(Stack *s)
{
    if(!Empty(s))
    {
        s->top--;
    }
    else
    {
        printf("栈空\n");
    }
}

//取栈顶元素
datatype Top(Stack *s)
{
    if(!Empty(s))
    {
        return s->data[s->top];
    }
    else
    {
        printf("栈空\n");
    }
}

//销毁栈
void Destroy(Stack *s)
{
    s->top=-1;
    free(s->data); //释放堆上内存
}

 

测试栈的代码

 

 

#include<stdio.h>
#include "DynamicStack1.0.h"
int main()
{
    int i=0;
    Stack p; 
    Stack *s;
    s=&p;
    // struct stack s;
    //初始化栈
    printf("\n###########初始化栈###########\n");
    init(s);
    printf("----------------------------------");    
    //入栈操作
    printf("\n###########入栈操作###########\n");
    for(i=0;i<=10;i++)
    {
        Push(s,i);
    }
    printf("----------------------------------");
    //取栈顶元素
    printf("\n###########取栈顶元素###########\n");
    printf("%d\n",Top(s));
    printf("----------------------------------");    
    //出栈操作
    printf("\n###########出栈操作###########\n");
    for(i=0;i<=12;i++)
    {
        Pop(s);
    }  
    printf("----------------------------------");
    //取栈顶元素    
    printf("\n###########取栈顶元素###########\n");
    Top(s);
    printf("----------------------------------");
    //销毁栈
    printf("\n###########销毁栈###########\n"); 
    Push(s,10);
    Destroy(s);
    Top(s);
}

 

这样就可以实现无限大小的栈了,这里realloc之后的指针,在free的时候容易出错

 

  • 15
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
可以用来实现表达式求值。下面是一种基于的表达式求值方法的 C 语言实现: ```c #include <stdio.h> #include <stdlib.h> #define MAX_STACK_SIZE 100 typedef struct { int top; int data[MAX_STACK_SIZE]; } Stack; void init_stack(Stack *s) { s->top = -1; } int is_empty(Stack *s) { return s->top == -1; } int is_full(Stack *s) { return s->top == MAX_STACK_SIZE - 1; } void push(Stack *s, int item) { if (is_full(s)) { printf("Error: stack is full\n"); exit(EXIT_FAILURE); } s->top++; s->data[s->top] = item; } int pop(Stack *s) { if (is_empty(s)) { printf("Error: stack is empty\n"); exit(EXIT_FAILURE); } int item = s->data[s->top]; s->top--; return item; } int peek(Stack *s) { if (is_empty(s)) { printf("Error: stack is empty\n"); exit(EXIT_FAILURE); } return s->data[s->top]; } int is_operator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } int evaluate(int operand1, int operand2, char operator) { switch (operator) { case '+': return operand1 + operand2; case '-': return operand1 - operand2; case '*': return operand1 * operand2; case '/': return operand1 / operand2; default: printf("Error: invalid operator\n"); exit(EXIT_FAILURE); } } int evaluate_expression(char *expression) { Stack operand_stack; Stack operator_stack; init_stack(&operand_stack); init_stack(&operator_stack); for (int i = 0; expression[i] != '\0'; i++) { char c = expression[i]; if (c == '(') { push(&operator_stack, c); } else if (c == ')') { while (peek(&operator_stack) != '(') { char op = pop(&operator_stack); int operand2 = pop(&operand_stack); int operand1 = pop(&operand_stack); int result = evaluate(operand1, operand2, op); push(&operand_stack, result); } pop(&operator_stack); // pop the '(' } else if (is_operator(c)) { while (!is_empty(&operator_stack) && peek(&operator_stack) != '(' && ((c == '*' || c == '/') || (peek(&operator_stack) == '+' || peek(&operator_stack) == '-'))) { char op = pop(&operator_stack); int operand2 = pop(&operand_stack); int operand1 = pop(&operand_stack); int result = evaluate(operand1, operand2, op); push(&operand_stack, result); } push(&operator_stack, c); } else if (c >= '0' && c <= '9') { int operand = c - '0'; while (expression[i + 1] >= '0' && expression[i + 1] <= '9') { operand = operand * 10 + (expression[i + 1] - '0'); i++; } push(&operand_stack, operand); } } while (!is_empty(&operator_stack)) { char op = pop(&operator_stack); int operand2 = pop(&operand_stack); int operand1 = pop(&operand_stack); int result = evaluate(operand1, operand2, op); push(&operand_stack, result); } return pop(&operand_stack); } int main() { char expression[] = "((2+3)*4)-5"; int result = evaluate_expression(expression); printf("%s = %d\n", expression, result); return 0; } ``` 该程序定义了一个 `Stack` 结构体,包含一个 `top` 成员变量和一个 `data` 整型数组,用于存储的元素。程序实现的基本操作,包括初始化、判断是否为空或已满、入、出和获取顶元素等。同时,程序还实现了一个 `is_operator` 函数,用于判断一个字符是否为运算符;一个 `evaluate` 函数,用于计算两个操作数和一个运算符的结果;以及一个 `evaluate_expression` 函数,用于计算一个表达式的值。该函数首先创建两个,一个用于存储操作数,另一个用于存储运算符。接着,遍历表达式中的每个字符,根据字符的类型执行不同的操作,包括入、出、计算和压入等。最后,将操作数中的最终结果作为函数的返回值。 以上就是一个基于的表达式求值方法的 C 语言实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值