第一步
定义链栈
typedef struct Snode{ int data; struct Snode *next; }Snode , *LinkStack;
第二步
初始化栈
bool InitStack(LinkStack &s){ s = NULL; return true; }
第三步
判断是否为空
bool Empty(LinkStack s){ if(s == NULL) return true; return false; }
第四步
入栈
bool Push(LinkStack &s , int e){ LinkStack p = new Snode; p -> data = e; p -> next = s; s = p; return true; }
第五部
出栈
//出栈 bool Pop(LinkStack &s , int &e){ if(Empty(s)) return false; e = s->data; LinkStack p = s; s = s->next; delete p; return true; }
第六步
取栈顶元素
int GetTop(LinkStack s){ if(Empty(s)) return false; return s->data; }
第七步
抄完书了,开始写
int main() { LinkStack s; //定义链栈 InitStack(s); // 初始化链栈 string a; //定义字符串 a 这里是c++的用法,为什么我非要用c++呢, // 当然是想让你们自己写啦,哈哈,这里等价于 char a[100]; cin>>a; // 输入字符串a reverse(a.begin(), a.end()); //c++内置函数,包含在#include<algorithm>头文件,反转字符串,知道大家没学过,哈哈,自己尝试写写这个函数吧 int t = 0,t1 = 0; // 定义两个临时变量,下边要用 for(int i = 0 ;i < a.length() ;i++){ //a.length(),c++内置函数,大家自己写写,或者,你去网上熟练的搜下它怎么用。 if(a[i] >= '0' && a[i] <= '9') Push(s,a[i]-'0'); //如果输入的前缀表达式,是数字的话,就把这个字符所对应的数字,放入栈里 //比如 0 = ‘0’-‘0’ 1 = ‘1’ - ‘0’ ; else { //如果是运算符,就从栈里拿出两个元素进行运算 if(!Empty(s)) Pop(s, t); if(!Empty(s)) Pop(s, t1); int sum = 0; switch (a[i]) { case '+': sum = t + t1; break; case '-': sum = t - t1; break; case '*': sum = t * t1; break; case '/': sum = t / t1; break; default: break; } Push(s, sum); //把运算后的结果放进栈中 } } //最后当循环结束的时候,大家会发现,栈中只有一个元素,就是我们输入的前缀表达式的值 cout << GetTop(s)<<"\n"; //输出结果,over return 0; }
完整代码
// // main.cpp // 数据结构3 // // Created by 宋玉良 on 2020/10/29. // #include<bits/stdc++.h> using namespace std; typedef struct Snode{ int data; struct Snode *next; }Snode , *LinkStack; //初始化 bool InitStack(LinkStack &s){ s = NULL; return true; } //判断是否为空 bool Empty(LinkStack s){ if(s == NULL) return true; return false; } //入栈 bool Push(LinkStack &s , int e){ LinkStack p = new Snode; p -> data = e; p -> next = s; s = p; return true; } //出栈 bool Pop(LinkStack &s , int &e){ if(Empty(s)) return false; e = s->data; LinkStack p = s; s = s->next; delete p; return true; } //取栈顶元素 int GetTop(LinkStack s){ if(Empty(s)) return false; return s->data; } int main() { LinkStack s; InitStack(s); string a; cin>>a; reverse(a.begin(), a.end()); int t = 0,t1 = 0; for(int i = 0 ;i < a.length() ;i++){ if(a[i] >= '0' && a[i] <= '9') Push(s,a[i]-'0'); else { if(!Empty(s)) Pop(s, t); if(!Empty(s)) Pop(s, t1); int sum = 0; switch (a[i]) { case '+': sum = t + t1; break; case '-': sum = t - t1; break; case '*': sum = t * t1; break; case '/': sum = t / t1; break; default: break; } Push(s, sum); } } cout << GetTop(s)<<"\n"; return 0; }