質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Q&A

解決済

1回答

1150閲覧

逆ポーランド記法の閉じ括弧がうまく処理できない

sakippe

総合スコア21

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

0グッド

0クリップ

投稿2022/06/10 07:34

逆ポーランドに変換するプログラムを作っています。以前質問した最初からセグメントエラーが出る件については解決しました。
main関数のsuuzi=3つまりトークンが")"のときにうまくできません。記号スタックから"("を pop するまで,pop して取り出した演算子を出力キューに enqueue する.取り出した"("は enqueueしない.なお,"("を pop するまでに記号スタックが空になった場合はエラーと表示する.
(30-40)と入力したとき通常は
<ちゃんと初期化されているか調べています>
QUEUE[]
STACK[]
<(>
QUEUE[]
STACK[ ( ]
<30>
QUEUE[ 30 ]
STACK[ ( ]
<->
QUEUE[ 30 ]
STACK[ ( - ]
<40>
QUEUE[ 30 40 ]
STACK[ ( - ]
<)>
QUEUE[ 30 40 - ]
STACK[]

現在のプログラムでは
QUEUE[]
STACK[]
<(>
QUEUE[]
STACK[ ( ]
<30>
QUEUE[ 30 ]
STACK[ ( ]
<->
QUEUE[ 30 ]
STACK[ ( - ]
<40>
QUEUE[ 30 40 ]
STACK[ ( - ]
<)>
セグメントエラー

現在のプログラムは次の通り

C

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#include "lib1.h" 5 6#define MAX_TOKEN_NUM 200 7 8#define QUEUE_SIZE 100 9typedef char *QUEUE_TYPE; 10 11#define STACK_SIZE 100 12typedef char *STACK_TYPE; 13 14QUEUE_TYPE gQueue[QUEUE_SIZE]; 15int gQNum = 0; 16 17STACK_TYPE gStack[STACK_SIZE]; 18int gSNum = 0; 19 20void printStack(void){ 21 int i; 22 23 printf("STACK["); 24 for(i=0; i<gSNum; i++){ 25 printf(" %s ",gStack[i]); 26 if(i != gSNum - 1){ 27 printf(" "); 28 } 29 } 30 printf("]\n"); 31 return; 32} 33 34void printQueue(void){ 35 int i; 36 37 printf("QUEUE["); 38 for(i=0; i<gQNum; i++){ 39 printf(" %s ",gQueue[i]); 40 if(i != gQNum - 1){ 41 printf(" "); 42 } 43 } 44 printf("]\n"); 45 return; 46} 47 48void initQueue(void){ 49 gQNum = 0; 50} 51 52void initStack(void){ 53 gSNum = 0; 54} 55 56int isStackEmpty(void){ 57 return gSNum == 0; 58} 59 60void push(STACK_TYPE x){ 61 gStack[gSNum] = x; 62 gSNum++; 63} 64 65STACK_TYPE pop(void){ 66 STACK_TYPE x; 67 68 x = gStack[gSNum - 1]; 69 gSNum--; 70 return x; 71} 72 73void enqueue(QUEUE_TYPE x){ 74 gQueue[gQNum++] = x; 75} 76 77STACK_TYPE peek(void){ 78 if(gSNum == 0){ 79 fprintf(stderr, "エラー:空状態ではpeekはできません\n"); 80 exit(1); 81 } 82 return gStack[gSNum-1]; 83} 84 85/*tを数字、演算子、"("、")"のどれかを判断する 86参考work37のtaiou関数 87数字を0(else)、演算子を1、"("を2、")"を3*/ 88int tnohantei(char *t){ 89 int result; 90 91 if(strcmp(t, "+") == 0){ 92 result = 1; 93 }else if(strcmp(t, "-") == 0){ 94 result = 1; 95 }else if(strcmp(t, "*") == 0){ 96 result = 1; 97 }else if(strcmp(t, "/") == 0){ 98 result = 1; 99 }else if(strcmp(t, "(") == 0){ 100 result = 2; 101 }else if(strcmp(t, ")") == 0){ 102 result = 3; 103 }else{ 104 result = 0; 105 } 106 107 return result; 108} 109 110void enzansizyouken(char *ops, char *opt){ 111 char *op1 = "+"; 112 char *op2 = "-"; 113 char *op3 = "*"; 114 char *op4 = "/"; 115 char *x; 116 117 if(strcmp(ops, op1) == 0 && strcmp(opt, op3) == 0){ 118 push(opt); 119 }else if(strcmp(ops, op1) == 0 && strcmp(opt, op4) == 0){ 120 push(opt); 121 }else if(strcmp(ops, op2) == 0 && strcmp(opt, op3) == 0){ 122 push(opt); 123 }else if(strcmp(ops, op2) == 0 && strcmp(opt, op4) == 0){ 124 push(opt); 125 126 }else{ 127 while(!isStackEmpty() && strcmp(ops, "(") != 0 && strcmp(ops, "*") != 0 && strcmp(ops, "/") != 0){ 128 x = pop(); 129 enqueue(x); 130 } 131 push(opt); 132 } 133 return; 134} 135 136 137 138int main(void){ 139 char *token[MAX_TOKEN_NUM]; 140 char *t; 141 char *s; 142 char *k; 143 int tnum, i, suuzi; 144 145 tnum = read(token, MAX_TOKEN_NUM); /* 最初の入力 */ 146 while (tnum > 0){ 147 initQueue(); 148 initStack(); 149 150 printQueue(); 151 printStack(); 152 153 for(i=0;i<tnum;i++){ 154 t = token[i]; 155 suuzi = tnohantei(token[i]); 156 if(suuzi == 0){/*数字*/ 157 enqueue(t); 158 159 printQueue(); 160 printStack(); 161 162 }else if(suuzi == 1){ /*演算子*/ 163 if(isStackEmpty()){ 164 push(t); 165 }else{ 166 s = peek(); 167 enzansizyouken(s, t); 168 } 169 170 printQueue(); 171 printStack(); 172 173 }else if(suuzi == 2){/*(*/ 174 push(t); 175 176 printQueue(); 177 printStack(); 178 179 }else if(suuzi == 3){/*)*/ 180 s = peek(); 181 while(strcmp(s, "(") != 0){ 182 k = pop(); 183 enqueue(k); 184 } 185 if(isStackEmpty()){ 186 printf("スタックエラー\n"); 187 exit(1); 188 } 189 190 printQueue(); 191 printStack(); 192 193 } 194 } 195 196 /*逆ポーランド記号表示(エンキューの中身)*/ 197 tnum = read(token, MAX_TOKEN_NUM); /* 次の入力 */ 198 } 199 return 0; 200} 201

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

c

1 s = peek(); 2 while(strcmp(s, "(") != 0){ 3 k = pop(); 4 enqueue(k); 5 }

このループ中で s の値は変化しないので、s が ( 以外だと無限ループになり、スタックが空になっても pop() しようとします。

投稿2022/06/10 08:00

int32_t

総合スコア20884

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問