zoukankan      html  css  js  c++  java
  • 栈操作及其应用

    栈可以是顺序栈,也可以是链栈。

    顺序栈:

     1 const int maxSize = 100;
     2 // 顺序栈
     3 struct SqStack{
     4     int data[maxSize];
     5     int top;
     6 }
     7 
     8 void initStack(SqStack &s)
     9 {
    10     s.top=-1;
    11 }
    12 
    13 int isEmpty(SqStack s)
    14 {
    15     if(s.top == -1)
    16         return 1;
    17     else
    18         return 0;
    19 }
    20 
    21 int push(SqStack &s,int x)
    22 {
    23     if(s.top == maxSize-1)
    24         return 0;
    25     ++(s.top);
    26     s.data[s.top]=x;
    27     return 1
    28 }
    29 
    30 int pop(SqStack &s,int &x)
    31 {
    32     if(s.top==-1)
    33         return 0;
    34     x = s.data[s.top];
    35     --(s.top);
    36     return 1;
    37 }

    顺序栈还可以更简化,使用数组来创建:

    1 //简化版顺序栈
    2 int stack[maxSize];   
    3 int top = -1;             //  初始化栈
    4 stack[++top] = x;   //  进栈
    5 x = stack[top--];     //  出栈

    链栈:

     1 // 链栈
     2 struct LNode{
     3     int data;
     4     LNode *next;
     5 }
     6 
     7 void InitStack(LNode *&lst)
     8 {
     9     lst = new LNode;
    10     lst->next = NULL;
    11 }
    12 
    13 int isEmpty(LNode *lst)
    14 {
    15     if(lst->next == NULL)
    16         return 1;
    17     else
    18         return 0;
    19 }
    20 
    21 void push(LNode *lst,int x)
    22 {
    23     LNode *p;
    24     p = new LNode;
    25 
    26     p->data = x;
    27     p->next = lst->next;
    28     lst->next = p;
    29 }
    30 
    31 int pop(LNode *lst,int &x)
    32 {
    33     LNode *p;
    34     if(lst->next == NULL)
    35         return 0;
    36     p = lst->next;
    37     x = p->data;
    38     lst->next = p->next;
    39     free(p);
    40     return 1;
    41 }

    栈的应用:

    1. 编写算法,判断一个算术表达式中的括号是否配对。表达式已经存入字符数组中,元素从下标1开始存储,表达式中的字符个数为n

    思路:遍历这个表达式,当遇到第一个 '(' 时,入栈,继续遍历,如果遇到 ')' ,则将 '(' 出栈,划掉这两个括号,继续处理下一组括号。如果前面所有括号都被划掉,而下一个括号却是 ')' ,

    则括号不匹配,因为前面已经没有与之匹配的 '(' 了。如果下一个括号还是 '(' ,则先处理这个括号,处理完再处理前面的 '(' 。

     1 int match(char exp[],int n)
     2 {
     3     char stack[maxSize];
     4     int top = -1;
     5  
     6     int i;
     7     for(i=1;i<=n;++i){
     8         if(exp[i]=='(')
     9             stack[++top]='(';
    10         if(exp[i]==')'){
    11             if(top==-1)
    12                 return 0;
    13             else
    14                 --top;
    15         }
    16     }
    17     if(top==-1)   // 所有括号都被处理掉了,返回1
    18         return 1;   
    19     else              // 否则返回0
    20         return 0;
    21 }

    2.编写一个函数,求后缀表达式的值。(即逆波兰表达式的值)   表达式被存于一个字符数组中,以''结尾,并假设后缀表达式中的数字都只有一位。

    先定义一个运算函数:

     1 int op(int a,char op, int b)
     2 {
     3     if(op=='+') return a+b;
     4     if(op==''-) return a-b;
     5     if(op==''*) return a*b;
     6     if(op=='/'){
     7         if(b==0){
     8             cout<<"Error"<<endl;
     9             return 0;
    10         }else
    11             return a/b;
    12     }
    13 }

    后缀表达式计算函数:

     1 int com(char exp[])
     2 {
     3     int a,b,c;   //   a、b为操作数,c存储计算结果
     4     int stack[maxSize];
     5     int top = -1;
     6 
     7     char op;
     8     for(i=0;exp[i]!='';i++){
     9         if(exp[i]>='0'&&exp[i]<='9')
    10             stack[++top]=exp[i]-'0';
    11         else{
    12             op = exp[i];
    13             a=stack[top--];
    14             b=stack[top--];
    15       //  注意,根据后缀表达式的计算方式,应该用后出栈的数op先出栈的数
    16             c=op(b,op,a);   
    17             stack[++top]=c;
    18         }   
    19     }
    20     return stack[top];
    21 }

     

  • 相关阅读:
    【设计模式】—— 单例模式Singleton
    【java开发系列】—— 深克隆和浅克隆
    【设计模式】—— 原型模式Prototype
    ArcMap 导入Excel坐标数据
    如何将XML文件导入Excel中
    ArcGIS API for Javascript之专题图的制作(四)热力图渲染(上)
    ArcGIS js api 手动构建FeatureLayer
    word怎样从第三页开始设置页码
    ArcGIS API for JS4.7加载FeatureLayer,点击弹出信息并高亮显示
    [转载]ArcGIS SERVER 9.3如何清除REST缓存
  • 原文地址:https://www.cnblogs.com/ll-10/p/9702962.html
Copyright © 2011-2022 走看看