###前提・実現したいこと
被演算数(1文字分の英字)、演算子、および括弧(左括弧「(」と右括弧「)」) のトークンで構成された中置記法の算術式を読み込み、 スタックを用いて逆ポーランド記法の式を出力する Cのプログラムを作成する。
###発生している問題・エラーメッセージ
セグメントエラーが発生してしまう。
エラーメッセージ
./a.out
中置記法で入力する文字列の文字個数を指定してください:13
中置記法の順に代入文の文字列を一文字ずつ入力してください:A=(B-C)/D+EF
s[0]:A
s[1]:=
s[2]:(
s[3]:B
s[4]:-
s[5]:C
s[6]:)
s[7]:/
s[8]:D
s[9]:+
s[10]:E
s[11]:
s[12]:F
セグメントエラー
###該当のソースコード
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define TRUE 1
#define FALSE 0
#define SUCCESS 1 /* 成功 /
#define FAILURE 0 / 失敗 */
typedef char data_type; /*char型をdata_type型に置き換える */
typedef struct node_tag {
data_type data;
struct node_tag next; / 後続ノードへのポインタ /
} node_type; / ノードの型 */
node_type head; / スタックの先頭へのポインタ (変数宣言)*/
void initialize(node_type *pp) / スタックの初期化 */
{
pp = NULL; / スタックは空(先頭ノードなし) */
}
/* ノードを後ろに付け加える*/
node_type* new_node(data_type data, node_type** head) {
node_type* n = malloc(sizeof(data_type));
node_type* p;
n->data = data;
n->next = NULL;
if (*head == NULL) {
*head = n;
return n;
}
p = *head;
while(1) {
if (p->next == NULL) {
p->next = n;
break;
}
p = p->next;
}
return n;
}
//末尾のノードの文字を出力する
data_type last_node(node_type **pp)
{
node_type *temp=*pp;
while (temp != NULL) {
temp = (temp)->next;
}
return(temp->data);
}
int is_empty(node_type p) { / 空スタックのとき真、 そうでないならば偽を返す /
if (p == NULL) return TRUE; / 空スタックのとき /
else return FALSE; / 空スタックでないとき */
}
//スタックの先頭ノードの削除
int pop(node_type **pp)
{
node_type *temp;
if (*pp != NULL) {
temp = (*pp)->next;
free(pp); / メモリの解放 */
*pp = temp;
return SUCCESS;
}
else return FAILURE;
}
//スタックの先頭へのノードの挿入
int push(node_type **pp, data_type x)
{
node_type *temp;
temp = new_node(x, pp);
if (temp == NULL) return FAILURE;
*pp = temp;
return SUCCESS;
}
int prior(data_type s){
if(s=('A' || 'B' || 'C' || 'D' || 'E' || 'F' ||'G'))
return 5;
if(s='=')
return 0;
if(s='(')
return 4;
if(s=')')
return 1;
if(s='+'||'-')
return 2;
if (s='*'||'/')
return 3;
}
//スタックの先頭のデータの取得
data_type top(node_type p)
{
if (p == NULL) / 空スタックのとき /
return ('\0');
else / 空スタックでないとき /
return p->data; / スタックの先頭のデータを返す */
}
int main(void){
int n=0,i=0,j=0;
data_type s[50],p[50];
printf("中置記法で入力する文字列の文字個数を指定してください:");
scanf("%d",&n);
printf("中置記法の順に代入文の文字列を一文字ずつ入力してください:");
scanf("%c",&s[i]);
for(i=0;i<n;i++){
scanf("%c",&s[i]);
}
for(i=0;i<n;i++){
printf("s[%d]:%c\n",i,s[i]);
}
printf("hello");
initialize(&head);
new_node(s[0],&head);
printf("hello");
for(i=1;i<n;i++){
if(prior(top(head))<prior(s[i])){
new_node(s[i], &head);
}
if(prior(top(head))>=prior(s[i])){
p[j]=last_node(&head);
j++;
}
}
for(i=0;i<j;i++){
printf("%c",p[i]);
}
return 0;
}
###試したこと
###補足情報(言語/FW/ツール等のバージョンなど)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/25 07:47