二.栈的运用

一,顺序栈的静态分配

二,顺序栈的动态分配

#include
#include
#define initsize 5
#define incresize 5

typedef struct Sqstack{
    int *base;
    int *top;
    int stacksize;
}Sqstack;

void InitStack(Sqstack *s){
    (*s).base=(int *)malloc(initsize*sizeof(int));
    if(!(*s).base)exit(0);
    (*s).top=(*s).base;
    (*s).stacksize=initsize;
}
void Push(Sqstack *s,int e){
    if((*s).top-(*s).base >= (*s).stacksize){
        (*s).base=(int*)realloc((*s).base,((*s).stacksize+incresize)*sizeof(int));
        if(!(*s).base)exit(0);
        (*s).top=(*s).base+(*s).stacksize;
        (*s).stacksize+=incresize;
    }
    *((*s).top)=e;
    (*s).top++;
}
void GetTop(Sqstack s,int *e){
    if(s.top==s.base) printf("empty!");
    *e=*(s.top-1);
    
}
int StackLength(Sqstack s){
    return s.top-s.base;
}
int StackEmpty(Sqstack s){
    return (s.top==s.base);
}
void Pop(Sqstack *s,int *e){
    if((*s).top==(*s).base) exit(0);
    (*s).top--;
    *e=*((*s).top);
}
void Destroystack(Sqstack *s){
    if(s!=NULL){
        free((*s).base);
        (*s).base=NULL; (*s).top=NULL;
        (*s).stacksize=0;
    }
}

int main(){
    Sqstack s;
    InitStack(&s);
    int e,p,x;
    for(int j=0;j

二.栈的运用_第1张图片

三,栈链

#include
#include

typedef struct stacknode{
    int data;
    struct stacknode *next;
}stackNode,*Linkstack;

void Initstack(Linkstack *s){
    *s=(Linkstack)malloc(sizeof(stackNode));
    (*s)->next=NULL;
    
}
void Push(Linkstack s,int x){
    Linkstack p=(Linkstack)malloc(sizeof(stackNode));
    if(!p)exit(0);
    p->data=x;
    p->next=s->next;
    s->next=p;
    
}
void Gettop(Linkstack s,int *e){
    if(s->next==NULL)exit(0);
    *e=s->next->data;
}
int Empty(Linkstack s){
    return (s->next==NULL);
}

void Pop(Linkstack s,int *e){
    if(s->next==NULL){
        printf("空!");exit(0);
    }
    stackNode *p=s->next;
    e=p->data;
    s->next=p->next;
    free(p);
}
void Destroystack(Linkstack s){
    Linkstack p=s->next,q;
    while(p!=NULL){
        q=p->next;
        free(p);
        p=q;
    }
    free(s);
}
int main(){
    Linkstack s;
    Initstack(&s);
    
    int n,x;scanf("%d",&n);
    for(int i=0;i

二.栈的运用_第2张图片

四,进制转换

五,表达式求值

六,括号的匹配问题

七,迷宫问题

八,中缀表达式求值

题目描述

编写一个算法,利用栈求解中缀算术表达式的值。运算符包括+、-、*、/、(、)和=,参加运算的数为个位数整数类型且为正数。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可。)

输入

输入一个需要计算的算术表达式,例如:2+2=。

输出

输出为表达式的运算结果。

样例输入 Copy
1+1=
样例输出 Copy
2

 二.栈的运用_第3张图片

#include 
#include 
 
typedef struct Node {
    int data;
    struct Node *next;
} Node;
 
typedef struct {
    Node *top;
} Stack;
 
int is_operator(char ch) {
    return (ch == '+' || ch == '-' || ch == '*' || ch == '/');
}
 
int priority(char op) {
    switch (op) {
        case '+':
        case '-':
            return 1;
        case '*':
        case '/':
            return 2;
        default:
            return 0;
    }
}
 
int calculate(int a, char op, int b) {
    switch (op) {
        case '+':
            return a + b;
        case '-':
            return a - b;
        case '*':
            return a * b;
        case '/':
            return a / b;
        default:
            exit(1);
   

你可能感兴趣的:(数据结构C,算法)