标签:++ 下标 amp 数组 顺序 else 一个 error ret
栈可以是顺序栈,也可以是链栈。
顺序栈:
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.编写一个函数,求后缀表达式的值。(即逆波兰表达式的值) 表达式被存于一个字符数组中,以‘\0‘结尾,并假设后缀表达式中的数字都只有一位。
先定义一个运算函数:
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]!=‘\0‘;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 }
标签:++ 下标 amp 数组 顺序 else 一个 error ret
原文地址:https://www.cnblogs.com/ll-10/p/9702962.html