美文网首页
链式栈的实现及部分应用

链式栈的实现及部分应用

作者: JHW2017 | 来源:发表于2018-03-30 00:41 被阅读0次
/*
 *链式栈的实现
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define T int
//------链栈的存储结构------
typedef struct{//链结点
    T data;
    struct Stack *Link;//指向下一个节点
}Stack,*LinkNode;
LinkNode S;
void InitStack()
{//构造空栈,栈顶指针置空,S是链栈的栈顶
    S=NULL;
}

bool push(T e)
{//入栈将e插入表头,并使S指向e
    Stack* p=(Stack*)malloc(sizeof(Stack));
    if(p==NULL)return false;
    p->data=e;
    p->Link=S;
    S=p;
    return true;
}

T pop()
{//退栈,用x返回栈顶元素
    LinkNode p=S;
    T x=S->data;
    S=S->Link;
    free(p);
    return x;
}

T getop()
{//获取栈顶
    return S->data;
}

bool IsEmpty()
{//判断栈是否为空,是返回true,否则返回false
    if(S==NULL)return true;
    else return false;
}

/*bool BracketMatching(char s[],int n)
{//括号匹配
    for(int i=0;i<n;i++)
        {
            if(s[i]=='('||s[i]=='['||s[i]=='{')push(s[i]);
            if(s[i]==')')
            {
                if(!IsEmpty()&&getop()=='(')pop();
                else return false;
            }
            if(s[i]==']')
            {
                if(!IsEmpty()&&getop()=='[')pop();
                else return false;
            }
            if(s[i]=='}')
            {
                if(!IsEmpty()&&getop()=='{')pop();
                else return false;
            }

        }
        if(IsEmpty())return true;
        else return false;
}*/

void ReversePolishCalculator(char ch[],int n)
{//逆波兰表达式计算
    T el ,ell; //栈顶el,与el后面的ell
    T d=0; //用于累计数字
    int i =0; //数组下标
    while(i<n)
    {
        switch(ch[i]){
        case '+':
            el=pop();
            ell=pop();
            push(el+ell);
            break;
        case '*':
            el=pop();
            ell=pop();
            push(el*ell);
            break;
        case '-':
            el=pop();
            ell=pop();
            push(el-ell);
            break;
        case '/':
            el=pop();
            ell=pop();
            if(el==0){printf("除0");exit(0);}
            push(el/ell);
            break;
        case ' ':break;
        default :
            while(ch[i]>='0'&&ch[i]<='9'){
            d=d*10+ch[i]-'0';
            i++;
            }
            push(d);
            break;
        }
        i++;
        d=0;
    }
}

int main()
{
    char cht[100];
    fgets(cht,100,stdin);
    int u=0;
    while(cht[u++]!='\n');
    ReversePolishCalculator(cht,u-1);
    printf("%d",getop());
}

相关文章

  • 链式栈的实现及部分应用

  • 顺序存储/链式存储设计栈结构

    一、顺序存储1.1 定义常量及结构 1.2 栈方法实现 二、链式存储2.1 定义常量及结构 2.2 栈方法实现

  • 栈与队列(一)

    在这篇文章里,我们来实现自定义的链式栈。首先我们来看看链式栈的结构及操作定义。 链式栈结构定义 首先,新建两个文件...

  • C语言第七次作业:链表

    707. 设计链表 空指针 空节点 225. 用队列实现栈 链式存储栈 双队列实现栈 232. 用栈实现队列 链式...

  • day2:栈与栈的应用

    栈的定义 一种先进后出的方式 栈的实现 一:顺序方式 应用Stack.java 二:链式方式 如栈操作: 出栈操作...

  • 数据结构与算法

    一、线性表及应用 二、线性表的链式存储结构 三、栈与栈的应用 四、哈希表与树 五、二叉树遍历的应用之分治法 六、加...

  • 数据结构基础--链式栈

    链式栈是一种数据存储结构,可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不...

  • 《数据结构》第三章:栈和队列

    3.1.1栈的基本概念 3.1.2栈的顺序存储实现 3.1.3栈的链式存储实现 3.2.1队列的基本概念 3.2....

  • 数据结构实验1.4:栈和队列

    实验内容 : 1.采用链式存储实现栈的初始化、入栈、出栈操作。2.采用顺序存储实现栈的初始化、入栈、出栈操作。3....

  • 数据结构复习

    第三章 栈和队列 一 栈 栈的类型 顺序栈 链式栈 双向栈 栈的应用 数制转换 行编辑程序 迷宫求解 表达式求值:...

网友评论

      本文标题:链式栈的实现及部分应用

      本文链接:https://www.haomeiwen.com/subject/pthbcftx.html