【发布时间】:2018-06-12 17:44:48
【问题描述】:
我尝试通过将 pop 中的值存储在数组中来进行堆栈推送弹出操作。我对此代码有几个问题。
1.初始化部分效果好吗?编译的时候好像没问题但是还是很好奇
2. 删除部分也好用吗?虽然,我输入了!,但它似乎没有转到else if(strcmp (str[i], "!")==0) 部分。
3. pop 操作后如何存储值?我想将它存储为数组格式,但是当我将它们存储在数组中后打印出来时,发生了运行时错误。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stack *Stack;
struct stack {
char *array;
int size;
int top;
};//making stack
Stack create(int c);
Stack makeEmpty(void);//initialization
int isEmpty(Stack S)
{
if(S->top==-1)
return 0;
else
return 1;
};
void push(char X, Stack S)
{
S->array[++S->top]=X;
};
char pop(Stack S)
{
return S->array[S->top--];
};
void deleteStack(Stack S)
{
while (S->top>=0)
{
free(S->array[S->top]);
S->top--;
}
};
int main (void)
{
Stack S1=makeEmpty();
char input[100], result[30], result1;
char *word;
int cnt=0,cnt2=0, temp=0, k=0, i,j,l;
word=strtok(input, " ");
char *str[20];
while(1){
if(fgets(input,100,stdin)){
word=strtok(input, " ");//get input and tokenize
cnt=0;
while (word!=NULL)
{
str[cnt]=strdup(word);
cnt++;
word=strtok(NULL," ");
}
}
for (i=0; i<cnt; i++)
{
if (strcmp(str[i],"(")==0 && (isEmpty(S1)==0))
{
push(str[i],S1);
l++;
}
else if(strcmp(str[i],")")==0)
{
temp++;
for(j=0; j<cnt2; j++)
{
char result1=pop(S1);
result[k] =result1;
printf("%s ", result[k]);//This the place where I got runtime error
k++;
}
pop(S1);
cnt2=0;
}
else if(strcmp (str[i], "!")==0)
{
printf("in\n");
deleteStack(S1);
return 0;
}
else
{
if (isEmpty(S1)==1)
{
if (l!=0)
{
push(str[i],S1);
if (strcmp(str[i],"(")!=0)
{
cnt2++;
}
}
}
}
}
}
return 0;
}
Stack create(int c)
{
Stack S=(Stack)malloc(sizeof(struct stack));
S->size=c;
S->top=-1;
S->array=(char *)malloc(sizeof(char)*c);
return S;
}
Stack makeEmpty(void)
{
Stack S1=create(100);
S1[0].top=-1;
return S1;
}
【问题讨论】:
-
你的前 2 个问题太笼统了:初学者如何定义“好”?此外,您在一个问题中提出了 3 个不同的问题。只有最后一个问题有一些优点,但如果您将代码和问题集中在这一点上会更好:将您的代码限制为产生该错误的最小示例,并让我们知道您已经为调试问题所做的工作.
-
@Sebivor 只是为了让您知道
pipe不是标准C,而是POSIX。此外,每次都去操作系统做一个简单的堆栈听起来很浪费资源。 -
@Sebivor:我相信管道会提供 FIFO(先进先出)规则,而不是堆栈(LIFO — 后进先出)规则。
mkfifo()用于创建“命名管道”是有原因的。