zoukankan      html  css  js  c++  java
  • 1.栈的概念

    栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

    2.栈的特性:"先进后出,后进先出"。

    (1)顺序栈代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef struct snode
    {
        int data[105];
        int top;
    }SeqStack;
    void Init(SeqStack *s)    //置空栈
    {
        s->top=-1;
    }
    int EmptyStack(SeqStack *s)  //判断栈是否为空
    {
        if(s->top<0)
            return 1;   //为空返回1
        else
            return 0;
    }
    int Push(SeqStack *s,int x)   //将x进栈
    {
        if(s->top>=105)
        {
            printf("overflow!
    ");
            return 0;
        }
        s->top++;
        s->data[s->top]=x;
        return 1;
    }
    int Pop(SeqStack *s)     //出栈
    {
        int x;
        if(s->top<0)
        {
            printf("underflow!
    ");
            return 0;
        }
        x=s->data[s->top];
        s->top--;
        return x;
    }
    int GetTop(SeqStack *s)   //取栈顶元素
    {
        if(s->top<0)
        {
            printf("underflow!
    ");
            exit(0);
    
        }
        return(s->data[s->top]);
    }
    int main()
    {
      SeqStack *s;
      s=(SeqStack *)malloc(sizeof(SeqStack));
      s->top=-1;
      for(int i=1;i<=10;i++)
      {
          Push(s,i);
      }
      printf("栈顶元素%d
    ",GetTop(s));
      printf("出栈:
    ");
      for(int i=1;i<=10;i++)
      {
         printf("%d ",Pop(s));
      }
    }
    

    (2)链式栈:

    #include <stdio.h>
    #include <stdlib.h>
    #define Empty 0        /* 栈空 */
    #define Avail 1        /* 栈可用 */
    
    typedef struct SNode
    {
        int data;
        struct SNode *next;
    }StackNode;
    typedef struct LStack
    {
        StackNode *top;        /* 栈顶指针 */
        StackNode *bottom;    /* 栈底指针 */
        int height;            /* 链式栈高度 */
    }LinkStack;
    
    LinkStack InitStack (LinkStack pStack);    /* 栈顶指针、栈底指针、栈高度初始化*/
    LinkStack Push (LinkStack pStack);        /* 入栈 */
    LinkStack Pop (LinkStack pStack);        /* 出栈 */
    int StackEmpty (LinkStack pStack);        /* 判断栈是否为空 */
    LinkStack DeletStack (LinkStack pStack);/* 清空栈 */
    void DisplyStack (LinkStack pStack);    /* 遍历栈----自顶至底*/
    
    int main()
    {
        LinkStack p;
        char ch;
    
        p.height = 0;        /* 栈高度初始化为零 */
        p = InitStack (p); /* 栈初始化 */
        printf("Do you want to push stack(Y/N)?");
        scanf(" %c", &ch); 
        while (ch == 'Y' || ch == 'y')
        {
            p = Push(p);    /* 入栈 */
            DisplyStack(p);    /* 遍历栈 */
            printf("Do you want to push stack(Y/N)?");
            scanf(" %c", &ch); 
        }
        printf("Do you want to pop stack(Y/N)?");
        scanf(" %c", &ch);
        while (ch == 'Y' || ch == 'y')
        {
            p = Pop(p);        /* 出栈 */
            DisplyStack(p);    /* 遍历栈 */
            printf("Do you want to pop stack(Y/N)?");
            scanf(" %c", &ch);
        }
    
        return 0;
    }
    /* Function: 初始化栈顶、栈底、栈高度*/
    LinkStack InitStack (LinkStack pStack)
    {
        pStack.top = pStack.bottom = NULL;
        pStack.height = 0;
    
        return pStack;
    }
    
    /* Function: 判断栈是否为空 */
    int StackEmpty (LinkStack pStack)
    {
        if (pStack.top == NULL && pStack.bottom == NULL)
        {
            return Empty;
        }
        else
        {
            return Avail;
        }
    }
    
    /* Function: 入栈 */
    LinkStack Push (LinkStack pStack)
    {
        int data;
        StackNode *temp;
    
        if ((temp = (StackNode *)malloc(sizeof(StackNode))) == NULL)
        {
            printf("内存空间不足
    ");
            return pStack;
        }
        if (StackEmpty(pStack) == Empty)    /* 如果栈为空 */
        {
            pStack.top = pStack.bottom = temp;    /* 栈顶、栈底指针都指向新建节点 */
            temp->next = NULL;                /* 节点指针域为空 */
            printf("Please input data");
            scanf("%d", &data);
            pStack.top->data = data;
            pStack.height++;
    
            return pStack;
        }
        else        /* 栈不为空 */
        {
            temp->next = pStack.top;/* 新建节点指向原来的栈顶 */
            pStack.top = temp;        /* 栈顶指针指向新建节点 */
            printf("Please input data");
            scanf("%d", &data);
            pStack.top->data = data;
            pStack.height++;
    
            return pStack;
        }
    }
    
    /* Function: 出栈 */
    LinkStack Pop (LinkStack pStack)
    {
        StackNode *Second;
    
        
        if (StackEmpty(pStack) == Empty)    /* 判断栈是否为空 */
        {
            printf("栈为空,无法出栈
    ");
            return pStack;
        }
        if (pStack.top == pStack.bottom)    /* 如果出栈的元素为最后一个元素 */
        {
            printf("出栈元素为%d
    ", pStack.top->data);
            free(pStack.top);
            pStack.top = pStack.bottom = NULL; /* 栈顶、栈底都指针都置为空 */
            pStack.height--;
    
            return pStack;
        }
        printf("出栈元素为%d
    ", pStack.top->data);
        Second = pStack.top->next;    /* 指向栈顶的前一个元素*/
    
        free(pStack.top);    /* 释放栈顶节点 */
        pStack.top = Second;/* 将头指针移动到新的栈顶节点 */
        pStack.height--;
    
        return pStack;
    }
    
    /* Function: 遍历栈 自顶到底*/
    void DisplyStack (LinkStack pStack)
    {
        if (StackEmpty(pStack) == Empty)
        {
            printf("栈为空,无法遍历
    ");
            return ;
        }
        printf("栈中元素[");
        while (pStack.top != NULL)
        {
            printf("%d->", pStack.top->data);
            pStack.top = pStack.top->next;
        }
        printf("]
    ");
    }
    
    /* Function: 清空栈 */
    LinkStack DeletStack (LinkStack pStack)
    {
        StackNode *del;
    
        while (pStack.top != NULL)
        {
            del = pStack.top->next;    /* 栈顶节点的前一个节点 */
            free(pStack.top);        /* 释放节点 */
            pStack.top = del;        /* 栈顶指针移动到新栈顶 */
        }
    
        return pStack;
    }
    

    括号匹配:

    #include <stdio.h>
    #include <string.h>
    int top = -1;
    void push(char *a, char ch)
    {
        a[++top] = ch;
    }
    void pop(char *a)
    {
        if (top == -1)
            return;
        top--;
    }
    char visit(char *a)
    {
        if (top != -1)
        {
            return a[top];
        }
        else
        {
            return ' ';
        }
    }
    int main()
    {
        char a[30];
        char b[100];
        int n;
        int flag = 1;
        scanf("%d", &n);
     
        while (n--)
        {
            top = -1;
            scanf("%s", b);
            getchar();
     
            int len = (int)strlen(b);
            for (int i = 0; i < len; i++)
            {
                if (b[i] == '(' || b[i] == '{' || b[i] == '[' || b[i] == '<')
                {
                    push(a, b[i]);
                }
                else
                {
                    if (b[i] == ')')
                    {
                        if (visit(a) == '(')
                        {
                            pop(a);
                        }
                        else
                        {
                            printf("No
    ");
                            flag = 0;
                            break;
                        }
                    }
                    else if (b[i] == '}')
                    {
                        if (visit(a) == '{')
                        {
                            pop(a);
                        }
                        else
                        {
                            printf("No
    ");
                            flag = 0;
                            break;
                        }
                    }
                    else if (b[i] == ']')
                    {
                        if (visit(a) == '[')
                        {
                            pop(a);
                        }
                        else
                        {
                            printf("No
    ");
                            flag = 0;
                            break;
                        }
                    }
                    else
                    {
                        if (visit(a) == '<')
                        {
                            pop(a);
                        }
                        else
                        {
                            printf("No
    ");
                            flag = 0;
                            break;
                        }
                    }
                }
            }
            if (flag == 1)
            {
                if (top != -1)
                {
                    printf("No
    ");
                }
                else
                {
                    printf("Yes
    ");
                }
            }
            flag = 1;
        }
    }
    
  • 相关阅读:
    python 上传下载文件
    post方式加载iframe
    js 实现打印功能
    python 判断数据类型
    web样式无法正常显示
    C# 调用python
    PDF转换成Txt
    js预览PDF的插件(亲测支持IE9,火狐,等等)
    文件下载
    asp.net网站发布到服务器GET的技能
  • 原文地址:https://www.cnblogs.com/julyzqy/p/12777542.html
Copyright © 2011-2022 走看看