我找到了一些代码来实现堆栈的C实现,并决定使用它。但是,有几个typedef,我很难在stackT(实际上是一个char数组)中打印值。下面是代码。我做错什么了?
#包括
#包括
类型定义字符堆栈元素;
类型定义结构{
stackElementT*目录;
int最大值;
内景顶部;
}斯塔克;
void StackInit(stackT*stackP,int maxSize){
stackElementT*newContents;
newContents=(stackElementT*)malloc(sizeof(stackElementT)*maxSize);
if(newContents==NULL){
fprintf(stderr,“内存不足。\n”);
退出(1);
}
stackP->contents=newContents;
stackP->maxSize=maxSize;
stackP->top=-1;//空。。。
}
空堆销毁(stackT*stackP){
免费(stackP->内容);
stackP->contents=NULL;
堆栈->最大大小=0;
stackP->top=-1;//empty
}
intstackisEmpty(stackT*stackP){
返回stackP->top}
int StackIsFull(stackT*stackP){
返回stackP->top>=stackP->maxSize-1;
}
void StackPush(stackT*stackP,stackElementT元素){
如果(StackIsFull(stackP)){
fprintf(stderr,“无法推送元素:堆栈已满。\n”);
退出(1);
}
stackP->contents[+stackP->top]=元素;
}
stackElementT StackPop(stackT*stackP){
如果(StackIsEmpty(stackP)){
fprintf(stderr,“无法弹出元素:堆栈为空。\n”);
退出(1);
}
返回堆栈->内容[堆栈->顶部--];
}
空堆栈显示(stackT*stackP){
如果(StackIsEmpty(stackP)){
fprintf(stderr,“无法显示:堆栈为空。\n”);
出口(1);
}
内景一;
printf(“[”);
对于(i=0;itop;i++){
printf(“%c,”,stackP[i]);//问题出现在这里
}
printf(“%c”,stackP[stackP->top]);
}
int后缀(char*expr,int length){
内景一;
堆垛;
StackInit(&stack,1000);
内部温度;
对于(i=0;i如果((expr[i]>=48)和&(expr[i]printf(“是一个数字!推送%d\n“,expr[i]);
StackPush(&stack,expr[i]);
}
其他{
开关(expr[i]){
案例43:{
temp=StackPop(&stack);
StackPush(&stack,StackPop(&stack)+temp);
}
休息;
案例45:{
temp=StackPop(&stack);
StackPush(&stack,StackPop(&stack)-temp);
}
休息;
案例47:{
temp=StackPop(&stack);
StackPush(&stack,StackPop(&stack)/temp);
}
休息;
案例42:{
temp=StackPop(&stack);
StackPush(&stack,StackPop(&stack)*temp);
}
休息;
违约:
休息;
}
}
}
返回StackPop(&stack);
}
int主(){
内景一;
char*expr=“1 2 3+*3 2 1-+*”;
对于(i=0;expr[i]!='\0';i++);
printf(“%d\n”,后缀(expr,i));
}

最佳答案

编译器(MacOS X 10.6.7上的GCC 4.2.1)告诉我:

$ cc -O -std=c99 -Wall -Wextra     st.c   -o st
st.c: In function ‘StackDisplay’:
st.c:72: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘stackT’
st.c:74: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘stackT’
$

在我的代码版本中,这两行是printf()中的StackDisplay()语句,
就在你说你有问题的地方。
void StackDisplay(stackT *stackP)
{
    if(StackIsEmpty(stackP)) {
        fprintf(stderr, "Can't display: stack is empty.\n");
        exit(1);
    }
    int i;
    printf("[ ");
    for (i = 0; i < stackP->top; i++) {
        printf("%c, ", stackP[i]); //the problem occurs HERE
    }
    printf("%c ]", stackP[stackP->top]);
}

你可能想要stackP->contents[i]。通过该修复,程序“运行”,但会产生:
Can't pop element: stack is empty.

这是你现在要解决的问题。
(哦,我还修复了注释中诊断的formain()循环后的杂散分号。)
循环应该写成strlen(expr)(然后需要#include <string.h>)。实际上,主程序的主体简化为:
char* expr = "1 2 3 + * 3 2 1 - + *";
printf("%d\n", postfix(expr, strlen(expr)));

通常应该将top索引到下一个要使用的位置,因此初始值通常是0而不是-1
别学那些数字的ASCII码-忘了你学过的。
    if ((expr[i] >= 48) && (expr[i] <= 57)) {

你应该写:
    if ((expr[i] >= '0') && (expr[i] <= '9')) {

或者,更好(但你也必须#include <ctype.h>):
    if (isdigit(expr[i])) {

类似的评论也适用于交换机:
        switch (expr[i]) {
            case 43: {
                temp = StackPop(&stack);
                StackPush(&stack, StackPop(&stack)+temp);
            }
                break;

我不确定缩进后面的逻辑,但是43应该写成'+',45应该写成'-',47应该写成'/',42应该写成'*'
这将产生:
Is a number! Pushed 49
Is a number! Pushed 50
Is a number! Pushed 51
Is a number! Pushed 51
Is a number! Pushed 50
Is a number! Pushed 49
68

如果您按如下所示修复数字推码:
printf("Is a number! Pushed %d\n", expr[i] - '0');
StackPush(&stack, expr[i] - '0');

然后你得到:
Is a number! Pushed 1
Is a number! Pushed 2
Is a number! Pushed 3
Is a number! Pushed 3
Is a number! Pushed 2
Is a number! Pushed 1
20

再加上一些仪器,大致如下:
temp = StackPop(&stack);
printf("Sub: result %d\n", temp);
StackPush(&stack, temp);

每次操作后,结果是:
Is a number! Pushed 1
Is a number! Pushed 2
Is a number! Pushed 3
Add: result 5
Mul: result 5
Is a number! Pushed 3
Is a number! Pushed 2
Is a number! Pushed 1
Sub: result 1
Add: result 4
Mul: result 20
20

你很亲密。

关于c - 如何在此stackT中打印值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6273502/

10-15 04:29