这个星期学习了有关于栈的相关知识以及栈的一些应用,故将其记录下来
关于栈的图示这里就不进行演示了,以下是有关于栈使用中的一些代码
首先是栈创建
struct sqstack{ //创建一个栈
char base[MAXN];
int top;
};
sqstack mystack;
初始化
int initstack(sqstack &s){
if(s.base==NULL) return 0;
s.top=0;
return 1;
}
int push(sqstack & s, char x){
if(s.top>=maxn) return 0;
s.base[s.top++]=x; //数据进栈后,top指针后移一位
return 1;
}
int pop(sqstack &s ,char &e){
if(s.top<=0) return 0;
e=s.base[--s.top]; //top指针向前移一位,再拿出数据
return 1;
}
判断是否是空栈
int isempty(sqstack &s){
if(s.top==0) return 0;
else return 1;
}
1、利用栈进行括号表达式的匹配
int matchBracket(sqstack &s , char *bckstring){
initstack(s);
char tmp;
int len=strlen(bckstring);
for(int i=0;i<len;i++){
char x=bckstring[i];
if(x=='[' || x=='{' || x=='('){//如果是"[","{","(",也就是左括号就进栈
push(s,x);
}
else if(x==']'){ //如果是右括号就从栈中弹出一个数据并进行判断
if(!isempty(s)) return -2;
pop(s,tmp);
if(tmp!='[')
return -1;
}
else if(x=='}'){
if(!isempty(s)) return -2;
pop(s,tmp);
if(tmp!='{')
return -1;
}
else if(x==')'){
if(!isempty(s)) return -2;
pop(s,tmp);
if(tmp!='(')
return -1;
}
}
if(isempty(s)) return -3;
return 0;
}
2、利用栈进行迷宫搜索,思路很简单,就是进行四个方向的搜索,找到了就继续找,并且将该位置入栈,找不到就换个方向进行找,如果找不到的话就将当前节点弹出,并且从其他方向进行查找,代码如下
void mysearch(int x,int y, sqstack &s){
path tmp;
int tmpx=x,tmpy=y;
do{<//这里也可以用递归进行查找,不过递归所消耗的时间和空间相对来说会比较大
int ok=1;
mp[x][y]=1;
tmp.x=x;
tmp.y=y;
push(s,tmp);
if(x==n && y==n) break;
if(y+1<=n){
tmpx=x,tmpy=y+1;
if(!mp[tmpx][tmpy]){
mp[x][y]=1;
ok=0;
y++;
}
}
if(x+1<=n && ok){
tmpx=x+1,tmpy=y;
if(!mp[tmpx][tmpy]){
mp[x][y]=1;
ok=0;
x++;
}
}
if(y-1>0 &&ok){
tmpx=x,tmpy=y-1;
if(!mp[tmpx][tmpy]){
ok=0;
mp[x][y]=1;
y--;
}
}
if(x-1>0 && ok){
tmpx=x-1,tmpy=y;
if(!mp[tmpx][tmpy]){
mp[x][y]=1;
ok=0;
x--;
}
}
if(ok) {
if(isempty(s))
{
pop(s);
path tmp= pop(s);
x=tmp.x;
y=tmp.y;
}
}
}while(isempty(s));
}
进行表达式的计算
stack<char> ep;
stack<double> cnt;
void calc(char x){
double ta=cnt.top(); cnt.pop();
double tb=cnt.top(); cnt.pop();
switch(x){
case '+' : tb+=ta;break;
case '-' : tb-=ta;break;
case '*' : tb*=ta;break;
case '/': tb=tb*1.0/ta;break;
}
cnt.push(tb);
}
void transfer(string str){
char x[20];
while(!ep.empty()) ep.pop();
while(!cnt.empty()) cnt.pop();
int i=0,j=0;char ctmp;int itmp=0;double dtmp=0;
char c=str[0];
while(c!='#'){
c=str[i];
if(c>='0' && c<='9'){
while((c>='0' && c<='9' ) || c=='.'){
x[j++]=c;
i++;
c=str[i];
}
x[j]='\0';
dtmp = atof(x);
j=0;
cnt.push(dtmp);
//cout<<dtmp<<" ";
}
else if(c=='(' || c=='*' || c=='/'){
ep.push(c);
i++;
}
else if(c=='+' || c=='-'){
if(ep.empty()) ep.push(c);
else {
do{
ctmp=ep.top();
if(ctmp=='('){
break;
}
else{
calc(ctmp);
ep.pop();
}
}while(!ep.empty() && ctmp!='(');
ep.push(c);
}
i++;
}
else if(c==')'){
do{
ctmp=ep.top();
if(ctmp=='('){ep.pop(); break;}
else {
calc(ctmp);
ep.pop();
}
}while(!ep.empty() && ctmp!='(');
i++;
}
else if(c=='#') break;
}
while(!ep.empty()){
calc(ep.top());
ep.pop();
}
}
未完待续。。