c语言问题 输出有问题 求指教

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAX 10000
typedef struct astack *Stack;
typedef struct astack
{
int top;
int maxtop;
char*data;
}Astack;

int main()
{
int f(char* a[]);
Stack StackInit(int size);
int StacckFull(Stack S);
void Push(char x,Stack S);
char Pop (Stack S);
char a[10001];int t;

scanf("%s",a);
t= f( a);

return 0;

}
Stack StackInit(int size)
{
Stack S=malloc(sizeof*S);
S->data=malloc(size*sizeof(char));
S->maxtop=size;
S->top=-1;
return S;
}
int StackFull(Stack S)
{
return S->top=S->maxtop;
}
int StackEmpty(Stack S)
{
return S->top<0;}
void Push(char x,Stack S)
{
if(!StackFull(S))
S->data[++S->top]=x;
}
char Pop (Stack S)
{
if(!StackEmpty(S))
return S->data[S->top--];

}
int f(char *a[])

{
int n,i,j=0; char b[1000];
Stack S= StackInit(MAX);
n=strlen(a);
for(i=1;i<n;i++)
{
if(a[i-1]=='(')
{ Push('(',S);
j++;}
else if(a[i-1]==')')
{
if(StackEmpty(S))
{Push(')',S); j++;}
else if(!StackEmpty(S)) {Pop(S);j--;}
}
}
if(StackEmpty(S))
{for(i=0;i<n;i++)
printf("%c",a[i]);}
else {for(i=0;i<j;i++)
b[j-1-i]=Pop(S);
for(i=0;i<j;i++)
printf("%c",b[i]);
printf("\n");}return 0;
}

具体调试自己弄吧……
下面是我觉得的问题:
1、在实现operator=()时没有考虑自我赋值的情况(不严密,但不影响此次实验结果)
2、input()函数中不能保证name被正确赋值
3、while((c=getchar())!='\n'||i<n) //输入空格键或超过最大商品数则停止输入。这句话矛盾,安根据我的理解,将或运算改为与运算
4、 for(int j=0;j<=i;j++) //遍历对象数组,输出商品信息。循环结束的条件错误,比如i==n成立时,则循环内a[j]会超出范围
5、while(tag)循环内里面的语句:其一、将c=getchar()放到第一个 if 前面,因为c这个变量后面还需要用到,或者删除第二个if 中的c=getchar(),将其改为c==027;其二,ESC的ASCII码不是十进制的27吗?027代表八进制的27,不是ESC,自己查表再看一下吧

建议:
1、适用C++提供的类string来代替字符串,比如string name;
2、减少不必要的注释
3、耐心加仔细
2011年
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-23
int StackFull(Stack S)
{
return S->top==S->maxtop;/*此处是判断,不是赋值*/
}追问

还是输出有问题啊

追答

#include
#include
#include
#include

#define MAX 10000
typedef struct astack *Stack;
typedef struct astack
{
int top;
int maxtop;
char*data;
}
Astack;

int main()
{
int f(char* a);
Stack StackInit(int size);
int StacckFull(Stack S);
void Push(char x, Stack S);
char Pop(Stack S);
char a[10001];
int t;

scanf("%s", a);
t = f( a);

system("pause");
return 0;
}

Stack StackInit(int size)
{
Stack S = malloc(sizeof * S);
S->data = malloc(size * sizeof(char));
S->maxtop = size;
S->top = -1;
return S;
}
int StackFull(Stack S)
{
return S->top == S->maxtop;
}
int StackEmpty(Stack S)
{
return S->top data[++S->top] = x;
}
char Pop(Stack S)
{
if (!StackEmpty(S))
return S->data[S->top--];
}
char Top(Stack S)
{
if (!StackEmpty(S))
return S->data[S->top];
return 0;
}
int f(char *a)
{
int n, i, j = 0; char b[1000];
Stack S = StackInit(MAX);
n = strlen(a);
for (i = 1;i <= n;i++)
{
if (a[i - 1] == '(')
{
Push('(', S);
j++;
}
else if (a[i - 1] == ')')
{
if (StackEmpty(S) || Top(S) == ')')
{Push(')', S); j++;}
else if (!StackEmpty(S)) {Pop(S);j--;}
}
}
if (StackEmpty(S))
{
for (i = 0;i < n;i++)
printf("%c", a[i]);
}
else
{
for (i = 0;i < j;i++)
b[j - 1 - i] = Pop(S);
for (i = 0;i < j;i++)
printf("%c", b[i]);
printf("\n");
}
return 0;
}

第2个回答  2011-09-24
#include<stdio.h>
#include<string.h>
#include<malloc.h>

#define MAX 10000

typedef struct astack
{
int top;
int maxtop;
char *data;
}Astack;
typedef struct astack *Stack;

Stack StackInit(int size)
{
Stack S = malloc(sizeof*S);
S->data = malloc(size*sizeof(char));
S->maxtop = size;
S->top = -1;
return S;
}

int StackFull(Stack S)
{
return S->top=S->maxtop;
}

int StackEmpty(Stack S)
{
return S->top<0;
}

void Push(char x,Stack S)
{
if(!StackFull(S))
S->data[++S->top]=x;
}

char Pop(Stack S)
{
if(!StackEmpty(S))
return S->data[--S->top];
return '\0';
}

int f(char *a)
{
int n,i,j=0;
char b[1000];
Stack S = StackInit(MAX);
n=strlen(a);

for(i = 1; i < n; i++) {
if(a[i-1] == '(') {
Push('(', S);
j++;
} else if(a[i-1] == ')') {
if(StackEmpty(S)) {
Push(')',S);
j++;
} else if(!StackEmpty(S)) {
Pop(S);j--;
}
}
}

if(StackEmpty(S)) {
for(i = 0; i < n; i++)
printf("%c",a[i]);
}
else {
for(i = 0; i < j; i++)
b[j-1-i] = Pop(S);
for(i = 0; i < j; i++)
printf("%c", b[i]);
printf("\n");
}
return 0;
}

int main()
{
int t;
char a[10001];
//int f(char* a[]);
//Stack StackInit(int size);
//int StacckFull(Stack S);
//void Push(char x, Stack S);
//char Pop (Stack S);

scanf("%s", a);
t= f(a);

return 0;
}
简单的试了下. 看样子是你对指针和二级指针理解不够. 还有函数的参数部分

你这数组b干嘛的,算法有问题吧.
看你做的是括号匹配.
你的是有一个)和前一个(匹配 j--. 怎么觉得怪怪的,你再仔细看下.追问

还是输出有问题啊 要求若输入()()则输出()()若输入)()()))则输出)))

追答

你那算法那有点问题, 这种算法上的事情找一个括号匹配的看看吧.
#include
#include
#include

#define MAX 10000

typedef struct astack
{
int top;
int maxtop;
char *data;
}Astack;
typedef struct astack *Stack;

Stack StackInit(int size)
{
Stack S = malloc(sizeof*S);
S->data = malloc(size*sizeof(char));
S->maxtop = size;
S->top = -1;
return S;
}

int StackFull(Stack S)
{
return S->top >= S->maxtop;
}

int StackEmpty(Stack S)
{
return S->top data[++S->top] = x;
}

char Pop(Stack S)
{
if(!StackEmpty(S))
return S->data[S->top--];
return '\0';
}

int f(char *a)
{
int n;
int i;
int j=0;
char b[1000];
Stack S = StackInit(MAX);
n=strlen(a);
for(i = 1; i <= n; i++) {
if (a[i-1] == '\0')
break;
if(a[i-1] == '(') {
Push('(', S);
j++;
} else if(a[i-1] == ')') {
if(!StackEmpty(S)) {
Push(')', S);
j++;
} else if(StackEmpty(S)) {
Pop(S);
j--;
}
}
}

if(StackEmpty(S)) {
for(i = 0; i < n; i++)
printf("%c", a[i]);
} else {
for(i = 0; i < j; i++)
b[j-1-i] = Pop(S);
for(i = 0; i < j; i++)
printf("%c", b[i]);
printf("\n");
}
return 0;
}

int main()
{
int t;
char a[10001];
scanf("%s", a);
t= f(a);
return 0;
}

追问

不行输入什么输出还是什么

追答

大哥,你不要全输入括号啊. 你输入一些其他的字符. 然后再看效果. 这段代码是不是你写的啊

本回答被提问者采纳
相似回答