上一次修改时间:2016-07-05 11:13:11

  1. 栈的实现

  2. /*
     * 栈的实现可以用链表或数组的方式(下面代码为数组实现)
     * 栈的应用:平衡符号
     * 算法说明:创建一个栈,顺序读取文本的每个字符,遇到开放符号则进栈;
     * 遇到闭合符号时,弹出栈顶元素并与读取的闭合符号比较,是否为成对的符号
     */
    #include <stdio.h>
    #include <stdlib.h>
    #define Error(Str)    FatalError(Str);
    #define FatalError(Str)    fprintf(stderr, "%s\n", Str), exit(1)
    #define EmptyTOS    (-1)
    #define MinStackSize    (5)
    typedef char ElementType;
    struct StackRecord;
    typedef struct StackRecord *Stack;
    struct StackRecord
    {
        int Capacity;
        int TopOfStack;
        ElementType *Array;
    };
    Stack CreateStack(int MaxElements);
    void DisposeStack(Stack S);
    int IsEmpty(Stack S);
    int IsFull(Stack S);
    void MakeEmpty(Stack S);
    void Push(ElementType X, Stack S);
    ElementType Top(Stack S);
    void Pop(Stack S);
    ElementType TopAndPop(Stack S);
    /*
     * 栈的创建
     */
     Stack CreateStack(int MaxElements)
     {
         Stack S;
         
         if(MaxElements < MinStackSize)
             Error("Out of space!!!");
             
         S = malloc(sizeof(struct StackRecord));
         if(S == NULL)
             FatalError("Out of space!!!");
         
         S->Array = malloc(sizeof(ElementType) * MaxElements);
         if(S->Array == NULL)
             FatalError("Out of space!!!");
         S->Capacity = MaxElements;
         MakeEmpty(S);
         
         return S;
     }
     
    /*
     * 将栈置空
     */
    void MakeEmpty(Stack S)
    {
        S->TopOfStack = EmptyTOS;
    }
     
    /*
     * 栈的释放
     */
    void DisposeStack(Stack S)
    {
        if(S != NULL)
        {
            free(S->Array);
            free(S);
        }
    }
    /*
     * 检测一个栈是否为空
     */
    int IsEmpty(Stack S)
    {
        return S->TopOfStack == EmptyTOS;
    }
    /*
     * 检测一个栈是否已满
     */
    int IsFull(Stack S)
    {
        return S->TopOfStack == S->Capacity - 1;
    }
    /*
     * 进栈
     */
    void Push(ElementType X, Stack S)
    {
        if(IsFull(S))
        {
            Error("Full stack");
        }
        else
            S->Array[++S->TopOfStack] = X;
    }
    /*
     * 将栈顶返回
     */
    ElementType Top(Stack S)
    {
        if(!IsEmpty(S))
            return S->Array[S->TopOfStack];
        Error("Empty stack");
        return 0;
    }
    /*
     * 从栈弹出元素
     */
    void Pop(Stack S)
    {
        if(IsEmpty(S))
        {
            Error("Empty stack");
        }
        else
            S->TopOfStack--;
    }
    /*
     * 给出栈顶元素并从栈弹出
     */
    ElementType TopAndPop(Stack S)
    {
        if(!IsEmpty(S))
            return S->Array[S->TopOfStack--];
        
        //Error("Empty stack");
        
        return 0;
    }
    int main()
    {
        FILE *stream;
        int ch,is_empty;
        ElementType close_ch;
        stream = fopen("./code.txt","r");
        
        //创建一个能存放1000个元素的栈
        Stack stacker;
        stacker = CreateStack(1000);
        int line = 1,flag = 1;
        while((ch=fgetc(stream))!=EOF)
        {    
            //开放符号进栈
            if(ch == '{' || ch == '(')
                Push(ch, stacker);
            //闭合符号,和栈顶元素进行成对比较
            if(ch == '}' || ch == ')')
            {
                   close_ch = TopAndPop(stacker);
                switch(ch)
                {
                    case '}':
                        if(close_ch != '{')
                        {
                            flag = 0;
                            printf("第%d行的符号不平衡,皮卡!⊙﹏⊙‖\n", line);
                        }
                        break;
                    case ')':
                        if(close_ch != '(')
                        {
                            flag = 0;
                            printf("第%d行的符号不平衡,皮卡!⊙﹏⊙‖\n", line);
                        }
                        break;
                    default:
                        break;
                }
            }
            //文本行数统计
            if(ch == '\n')
                line++;
        }
        fclose(stream);
        is_empty = IsEmpty(stacker);
        if(flag)
        {
            if(is_empty)
                printf("文本没有不平衡的符号,皮卡!^_^\n");
            else
                printf("第%d行的符号不平衡,皮卡!⊙﹏⊙‖\n", line);
        }    
    }
  3. 栈的应用

    四则运算

    后缀表达式的计算

    函数调用:当在主函数中调用新函数时,需要先将主函数中的所有局部变量、执行新函数时的位置保存在栈中,当新函数执行完成后,再从栈中取数据并继续往下执行;