겨울방학 합숙 훈련 작업 (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
"); } if(strcmp(m,"top")==0) { if(stackempty()==0) { printf("%d
",s[top-1]); } else printf("empty
"); } n--; } printf("
"); } 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
"); } else { printf("no
"); } } return 0; }

좋은 웹페이지 즐겨찾기