掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26738

括弧の整合チェック
投稿者---TAK(2006/05/04 10:23:01)


スタックの問題で一部分からないところがあるので教えてください。




#include "stack.h"
#include <stdlib.h>
#include <stdio.h>

#define BUFLEN  100

  int main(void)
  {
    int ch, chst,err,i;

    char buf[BUFLEN];
    init_stack();
    err =0;
    fprintf(stderr,"Please enter C program.\n");

    while(1){
      fgets(buf, sizeof(buf),stdin);
      if(buf[1] =='\0'){
    if (empty_stack() == 1 && err ==0){
      fprintf(stderr,"Parentheses are correct.\n");
    }
    else {
      fprintf(stderr,"Parentheses error!!. /n");
    }
    break;
      }

/*分からないのはここからで、括弧の整合チェックのプログラムを書く*/


while((ch=buf[i++])!="\n"){
      if(ch== '('||'{'){
    push(ch)
      }

      if(chst==')'){
    printf("%c",pop())

      }

    

}
    

/*ここまで。考え方は開き括弧 '{' , '('のときはpushして、
閉じ括弧のときはpopでいうのはわかります。
*/



/*こちらはstack.hのソース*/


#include <stdlib.h>
#include <stdio.h>

#define stack_size 100
#define stack_el_type int

stack_el_type stack[stack_size];
int sp;

void init_stack()
{
sp =-1;
}

void push(stack_el_type x)
{
if(sp < stack_size-1){
stack[++sp]=x;
}
else{
printf("stack full error. \n");
exit(1);
}
}

stack_el_type pop()
{
if(sp >=0){
return stack[sp--];
}
else{
printf("stack empty error.\n");

exit(1);
}
}

int empty_stack()
{

if (sp==-1){

return 1;}

else {
return 0;
}
}

void print_stack()
{
if(sp==-1){

printf("stack empty");
}
int i;
if(sp>=0){
printf("stack data:");
for(i=0;i<=sp;i++)

printf("%2d ",stack[i]);

printf("\n");
}
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:括弧の整合チェック 26739 RiSK 2006/05/04 10:35:52


No.26739

Re:括弧の整合チェック
投稿者---RiSK(2006/05/04 10:35:52)


前半のソースコンパイル通りません。
せっかく張り直したのに,後半のソース,インデントされていません。
文字と文字列を混同しないようにしましょう。


さて,本題。

> 考え方は開き括弧 '{' , '('のときはpushして、
> 閉じ括弧のときはpopでいうのはわかります。

pushの方が分かっているなら
popの時に逆にすればよいです。

'}'の時popして'{'だったらOK. 違ったらNG
')'の時popして'('だったらOK. 違ったらNG
データ読み終わったときに!stack_empty()ならNG


この投稿にコメントする

削除パスワード

No.26740

Re:括弧の整合チェック
投稿者---RiSK(2006/05/04 17:25:03)


mainが0を返せば整合。mainが1を返せば不整合。
文字定数,文字列,およびコメントは全く考慮していません。
//main.c
#include<stdio.h>
#include"stack.h"
int main(void){
    int c;
    while((c=getchar())!=EOF){
        if(c=='('||c=='{')stack_push(c);
        if(c==')'&&stack_pop()!='(')return 1;
        if(c=='}'&&stack_pop()!='{')return 1;
    }
    if(!stack_is_empty())return 1;
}

//stack.h
void stack_push(int);
int stack_pop(void);
int stack_is_empty(void);

//stack.c
#define STACK_SIZE 128
static int stack[STACK_SIZE],p;
void stack_push(int c){
    if(p>=STACK_SIZE)exit(1);
    stack[p++]=c;
}
int stack_pop(void){
    if(p<=0)exit(1);
    return stack[--p];
}
int stack_is_empty(void){
    return !p;
}



この投稿にコメントする

削除パスワード

No.26780

出来ました!
投稿者---TAK(2006/05/07 22:28:06)


なんとか出来ました!どうもありがとうございます!!


この投稿にコメントする

削除パスワード

No.26878

新たな問題
投稿者---TAK(2006/05/17 09:21:24)


学校で自動チェックを通したら、通らなくて、何故そうなのか分かりません。全然わからないので、どなたか教えてください!!
整合チェックのプログラムはfor文⇒switch文に変えました!


#include "stack.h" 
#include <stdlib.h> 
#include <stdio.h> 

#define BUFLEN 100 

int main(void) 
{ 
int ch, chst,err,i;

char buf[BUFLEN];

 init_stack();
 err =0; 
 fprintf(stderr,"Please enter C program.\n"); 

while (1) { 
  fgets(buf, sizeof(buf), stdin);
  if (buf[1] =='\0') {
    if (empty_stack() == 1 && err == 0)
      {fprintf(stderr, "Parentheses are correct.\n");
      } 
    else { 
      fprintf(stderr, "Parentheses error!!\n");
    } 
    break; 
  } 



/*****間違いがあるのはここから****/

  while((ch= buf[i++]) != '\0'&&ch!='\n') { 
    switch(ch){
    case '(':
      push(ch);
      print_stack();
      break;

    case '{':
      push(ch);
      print_stack();
      break;

    case ')':
      if( stack[sp]!= '('){
    err=1;
      }
      pop();
      print_stack;
      break;

       case '}':
      if( stack[sp]!= '{'){
    err=1;
      }
      pop();      
      print_stack;
      break;
      
    default:
      break;
    }
}
 
} 
 return 0;
}

/*****ここまで****/




/****stack.hのソース****/

/#include <stdlib.h>
#include <stdio.h>

#define stack_size 100
#define stack_el_type int

stack_el_type stack[stack_size];

int sp;
 void init_stack()
 {
 sp =-1;
 }

 void push(stack_el_type x)
 {
  if(sp < stack_size-1){
  stack[++sp]=x;
 }
   else{
  printf("stack full error. \n");
   exit(1);
  }
 }

stack_el_type pop()
  {
  if(sp >=0){
    return stack[sp--];
  }
    else{
        printf("stack empty error.\n");

  exit(1);
 }
}

int empty_stack()
{

if (sp==-1){

return 1;
}

  else {
   return 0;
  }
}

  void print_stack()
 { 
   if(sp==-1){

 printf("stack empty");
 }

 int i;
  if(sp>=0){
   printf("stack data:"); 
    for(i=0;i<=sp;i++)

   printf("%2d ",stack[i]);

   printf("\n"); 
  }
}



/*実行結果の例は次のとおりです。

****Execution results *****

Please enter C program.
void push(stack_el_type x)
stack data: 40
stack empty.
{
stack data: 123
if (sp < stack_size-1){
stack data: 123 40
stack data: 123
stack data: 123 123
stack[++sp] =x;
}
stack data: 123
else{
stack data: 123 123
printf("stack full error.\n");
stack data: 123 123 40
stack data: 123 123
exit(1);
stack data: 123 123 40
stack data: 123 123
}
stack data: 123
}
stack empty.

Parentheses are correct.

************************/



この投稿にコメントする

削除パスワード

No.26879

チェック方法
投稿者---TAK(2006/05/17 09:28:03)


UNIXやcygwinの場合は以下のコマンドでチェックできます。

cat test.c | ./dalgo4_3←整合チェックのプログラムのことです。

Parentheses are correct. となるかチェック.なれば成功
"test.c"をエディタで編集(括弧を一部削除)し,同様に実行
"Parentheses error."となるかチェック.なれば成功.

/*****test.c*****/

void push(stack_el_type x)
{
  if (sp < stack_size-1){
    stack[++sp] = x;
  }
  else {
      printf("stack full error. \n");
      exit(1);
   }
}






この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧