寒假集训作业(3)——栈与队列

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;
}


你可能感兴趣的:(集训作业,ACM题解报告)