http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2556
#include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; int temp[1000]; int main() { int top; char s[10]; int n; int T,i; while(cin>>T) { top=0; for(i=0;i<T; i++) { cin>>s; if(!strcmp(s,"push")) { scanf("%d", &n); temp[top++] = n; } else if(!strcmp(s,"pop")) { if(!top) {cout<<"error"<<endl;continue;} else temp[--top]; } else if(!strcmp(s,"top")) { if(!top) {cout<<"empty"<<endl;continue;} else cout<<temp[top-1]<<endl; } } cout<<endl; } return 0; }
//No.2 #include<stdio.h> #include<string.h> #include<stdlib.h> #define maxsize 100 int top=0; int push(int stack[],int x) { if(top>maxsize) return 0; stack[top++]=x; return 1; } int pop(int stack[]) { return stack[--top]; } int stackempty() { if ( top == 0) return 1; else return 0; } int main() { int n,s[maxsize],p,q; char m[5]; while(scanf("%d",&n)==1) { top=0; while(n>0) { scanf("%s",m); if(strcmp(m,"push")==0) { scanf("%d",&q); push(s,q); } if(strcmp(m,"pop")==0) { if(stackempty()==0) { top--; } else printf("error\n"); } if(strcmp(m,"top")==0) { if(stackempty()==0) { printf("%d\n",s[top-1]); } else printf("empty\n"); } n--; } printf("\n"); } return 0; }
上题只是粗浅地运用了栈的思想,采用数组方式实现。要注意栈顶指针的位置。
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2131
#include <iostream> using namespace std; int main() { int n,r,top=0; int ans[10000]; cin>>n>>r; for(;n!=0;top++) { ans[top]=n%r; n/=r; } while(top) { cout<<ans[--top]; } cout<<endl; }
也是运用了栈的思想,仍然需要注意指针的位置。
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2133
#include <iostream> #include <cctype> #include <cstdio> using namespace std; int calc(int a,int b,char symbol) { switch (symbol) { case '+':return a+b; case '-':return a-b; case '*':return a*b; case '/':return a/b; } } int main() { char formula[1000]; int mark=0; int temp[100]; int i=0; while(scanf("%c",&formula[i])) { if(formula[i]=='#') break; i++; } int size=i; for(int i=0;i<=size-1;i++) { if(isdigit(formula[i]))//come up with digit { temp[mark]=formula[i]-'0'; mark++; } else { temp[mark-2]=calc(temp[mark-2],temp[mark-1],formula[i]); mark--; } } cout<<temp[0]; }
跟学姐一起改了好久,出错有几个地方:1.switch语句格式错误;2.输入到哪里截止是一个重点;3.碰到符号只需要计算符号前面的两位,然后让他们入栈;4.碰到单纯的数字就让他们入栈;
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int main() { char a[100]; char temp[100]; int mark=0; while(cin>>a) { mark=0; for(int i=0;i<strlen(a);i++) { if(a[i]=='('||a[i]=='['||a[i]=='{')//push in all left-brackets... { temp[mark++]=a[i];//push in stack... } else if(a[i]==')'||a[i]==']'||a[i]=='}')//when right-brackets appears... { if(a[i]==')'&&temp[mark-1]=='(')//just seek the first-left one whether matches... { mark--;//re-write the left-bracket's address(mark)... } else if(a[i]==']'&&temp[mark-1]=='[') { mark--;//re-write the left-bracket's address(mark)... } else if(a[i]=='}'&&temp[mark-1]=='{') { mark--;//re-write the left-bracket's address(mark)... } else { /*temp[mark]=a[i];//not mentioned so next... mark++;//move the pointers...*/ } } } if (!mark) cout<<"yes"<<endl;//empty stack means it matches perfectly... else cout<<"no"<<endl; } return 0; }
You have to initialize "mark"!
思想是,碰到左括号,让左括号入栈,碰到右括号,让右括号从栈内搜索,如果有,让他们出栈,没有就进行下一个。。。
//No.2 #include<stdio.h> #include<string.h> int main() { char s[1000]; while(gets(s)) { int i,j,top=0; char a[1000]; int p=strlen(s); for(i=0;i<p;i++) { if(s[i]=='('||s[i]=='['||s[i]=='{') { a[top]=s[i]; top++; } else if(s[i]==')'||s[i]==']'||s[i]=='}') { if(a[top-1]=='('&&s[i]==')') { a[top-1]='\0'; top--; } else if(a[top-1]=='['&&s[i]==']') { a[top-1]='\0'; top--; } else if(a[top-1]=='{'&&s[i]=='}') { a[top-1]='\0'; top--; } else { a[top]=s[i]; top++; } } } if(top==0) { printf("yes\n"); } else { printf("no\n"); } } return 0; }