C语言版数据结构 关于四则运算的堆栈问题:请高人指出到底哪儿错了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言版数据结构 关于四则运算的堆栈问题:请高人指出到底哪儿错了相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//10+65-14/45+25*3
//10+(65-14)/45+25*3
#define MAXSIZE 40
typedef char datatype;
typedef struct


datatype data[MAXSIZE];
int top;
seqstack;
seqstack *s;
seqstack * initseqstack()//建立栈空间,初始化栈顶指针

seqstack *s;
s=(seqstack *)malloc(sizeof(seqstack));

s->top=-1;
return s;

int empty(seqstack *s)//判栈是否剩下最后一个元素

if(s->top==0)
return 1;
else
return 0;


int push(seqstack *s,char x)//入栈

if(s->top==MAXSIZE-1)

printf("overflow");
return 0;

s->top++;
s->data[s->top]=x;

return 1;


int pop(seqstack *s)//出栈
int a;
a=s->data[s->top];
s->top--;//先判断栈是否为空
return a;


datatype top(seqstack *s)//读栈顶元素

return (s->data[s->top]);

int yunsuan(int c,int d,char e)

int a;
if(e=='+')
a=d+c;
if(e=='-')
a=d-c;
if(e=='*')
a=d*c;
if(e=='/')
a=d/c;
return a;


void main()


seqstack *s;
datatype a,e;
int c,d;
int f;
s=initseqstack();
printf("请输入运算式\n");
scanf("%c",&a);
while(a!='=')

//if(a=='(')

if(a==')')

c=top(s);
pop(s);
e=(int)top(s);
pop(s);
d=(int)top(s);
pop(s);
pop(s);
push(s,(char)yunsuan(c,d,e));

//进栈过程中实现判断
if(a=='*'||a=='/')

push(s,a);
printf("please input a number too:\n");
scanf("%c",&a);
c=(int)a;
e=top(s);
pop(s);
d=(int)top(s);
pop(s);
push(s,(char)yunsuan(c,d,e));

push(s,a);
scanf("%c",&a);

while(!empty(s))

c=(int)top(s);
pop(s);
e=top(s);
pop(s);
d=(int)top(s);
pop(s);
push(s,(char)yunsuan(c,d,e));1111


f=(int)top(s);
pop(s);
printf("最后的结果是:%d\n",f);

不知道哪儿做错了,无法正常运行,

没看懂你主函数里写的代码。。。

这是我写的,给你标注了解释,你可以参考一下,简单说就是将中缀式处理成后缀式,在计算后缀式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE 1
#define FALSE 0

#define LEN 5//输入数字不得超过4位
#define MAXSIZE 40//数字和运算符总个数不得超过40个

typedef struct


char data[MAXSIZE][LEN];//栈区为二维数组
int top;

seqstack;

seqstack *initseqstack();
void push(seqstack *s, char *x);
char *pop(seqstack *s);
int optr(char *z);
int priority(char *a, char *b);
void process(char arrOne[][LEN], char arrTwo[][LEN]);
double calc(char *a, char *b, char *ch);
void express(char (*arrTwo)[LEN]);

seqstack *s = NULL;//声明全局变量

seqstack *initseqstack()//初始化栈顶指针

seqstack *s = (seqstack *) malloc (sizeof(seqstack));

s->top = -1;

return s;


void push(seqstack *s, char *x)//入栈

if (MAXSIZE-1 == s->top)

printf("overflow\n");
exit(0);


strcpy(s->data[++s->top], x);


char *pop(seqstack *s)//出栈

char *y = (char *) malloc (LEN * sizeof(char));
strcpy(y, s->data[s->top--]);
return y;


int optr(char *z)//判断是否为运算符,是返回TRUE

int i;
char *optr1[6] = "+", "-", "*", "/", "(", ")";

for (i=0; i<6; i++)

if (0 == strcmp(optr1[i], z))

return TRUE;


return FALSE;


int priority(char *a, char *b)//比较优先级

int i, j;
char *array[5] = "(", "+", "-", "*", "/";//优先级列表,由小到大

for (i=0; i<5; i++)

if (0 == strcmp(array[i], a))

break;


for (j=0; j<5; j++)

if (0 == strcmp(array[j], b))

break;



switch (i)

case 0: i = 0; break;
case 1:
case 2: i = 1; break;
case 3:
case 4: i = 2; break;


switch (j)

case 0: j = 0; break;
case 1:
case 2: j = 1; break;
case 3:
case 4: j = 2; break;


if (i >= j)

return TRUE;

else

return FALSE;



void process(char (*arrOne)[LEN], char (*arrTwo)[LEN])//将中缀式处理成后缀式(运算符入栈处理)

int i, j = 0;

s = initseqstack();//初始化

for (i=0; 0!=strcmp(arrOne[i], "\0"); i++)

if (1 < strlen(arrOne[i]) || (TRUE != optr(arrOne[i])))//arrOne[i][LEN]为数字时

strcpy(arrTwo[j++], arrOne[i]);//将数字拷贝到arrTwo

else if (0 == strcmp(arrOne[i], "("))

push(s, arrOne[i]);//入栈

else if (0 == strcmp(arrOne[i], ")"))

while ((-1 != s->top) && (0 != strcmp(s->data[s->top], "(")))

strcpy(arrTwo[j++], pop(s));//出栈

pop(s);//将"("弹出

else//此时arrOne的内容只可能是"+", "-", "*", "/"

if (-1 == s->top)

push(s, arrOne[i]);

else

while (-1 != s->top)

if (TRUE == priority(s->data[s->top], arrOne[i]))//与栈顶元素进行优先级比较

strcpy(arrTwo[j++], pop(s));

else

push(s, arrOne[i]);
break;


if (-1 == s->top)

push(s, arrOne[i]);





while (-1 != s->top)

strcpy(arrTwo[j++], pop(s));


/*后缀式的表达形式*/
/*for (i=0; 0!=strcmp(arrTwo[i], "\0"); i++)

printf("%s ", arrTwo[i]);

printf("\n");*/


double calc(char *a, char *b, char *ch)//运算,返回double类型

double num;
double numOne, numTwo;

numOne = atof(a);
numTwo = atof(b);//将字符串转化为double类型(atof是库函数)

switch(*ch)

case '+': num = numOne + numTwo; break;
case '-': num = numOne - numTwo; break;
case '*': num = numOne * numTwo; break;
case '/':
if ((0.000001 >= numTwo) && (-0.000001 <= numTwo))

printf("error!\n");

else

num = numOne / numTwo;

break;
default:
exit(0);


return num;


void express(char (*arrTwo)[LEN])//后缀式入栈运算

int i;
double num;

char result[10];
char numOne[LEN], numTwo[LEN];

s = initseqstack();//初始化

for (i=0; 0!=strcmp(arrTwo[i], "\0"); i++)

if (TRUE != optr(arrTwo[i]))//假如是数,则入栈

push(s, arrTwo[i]);

else

strcpy(numTwo, pop(s));
strcpy(numOne, pop(s));//将顶上两数字弹出

num = calc(numOne, numTwo, arrTwo[i]);//运算
gcvt(num, 10, result);//将double转换成字符串(gcvt是库函数)

push(s, result);//入栈



printf(" %s\n\n", result);//输出最终结果


void Menu(void)

printf("注意:\n");
printf("1.本程序有一定误差,误差范围大约是-0.001到+0.001\n");
printf("2.本程序只能处理正确的表达形式.\n");
printf("3.避免输入数字和计算结果越界.\n");
printf("4.输入方式:如输入表达式(-1+2)*3\n");
printf(" 输入:\n");
printf(" (空格-1空格+空格2空格)空格*空格3空格=回车\n");


void main(void)

int i = 0;

char arr[MAXSIZE][LEN]; //输入字符串
char arrOne[MAXSIZE][LEN] = "\0" ; //保存中缀式
char arrTwo[MAXSIZE][LEN] = "\0" ; //保存后缀式

Menu();

printf("\n\n\n请输入表达式:\n");

while (scanf("%s", arr[i]))

if (0 == strcmp(arr[i], "="))

break;

strcpy(arrOne[i], arr[i]);
i++;

process(arrOne, arrTwo); //调用
express(arrTwo); //调用
参考技术A
我就喜欢害人:)

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define ERR -1
#define MAX 100 /*定义堆栈的大小*/
int stack[MAX]; /*用一维数组定义堆栈*/
int top=0; /*定义堆栈指示*/

int push(int i) /*存储运算数,入栈操作*/

if(top<MAX)

stack[++top]=i; /*堆栈仍有空间,栈顶指示上移一个位置*/
return 0;

else

printf("The stack is full");
return ERR;


int pop() /*取出运算数,出栈操作*/

int var; /*定义待返回的栈顶元素*/
if(top!=NULL) /*堆栈中仍有元素*/

var=stack[top--]; /*堆栈指示下移一个位置*/
return var; /*返回栈顶元素*/

else
printf("The stack is empty!\n");
return ERR;

void main()

int m,n;
char l;
int a,b,c;
int k;
do
printf("\tAriothmatic Operate simulator\n"); /*给出提示信息*/
printf("\n\tPlease input first number:"); /*输入第一个运算数*/
scanf("%d",&m);
push(m); /*第一个运算数入栈*/
printf("\n\tPlease input second number:"); /*输入第二个运算数*/
scanf("%d",&n);
push(n); /*第二个运算数入栈*/
printf("\n\tChoose operator(+/-/*//):");
l=getche(); /*输入运算符*/
switch(l) /*判断运算符,转而执行相应代码*/

case '+':
b=pop();
a=pop();
c=a+b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;
case '-':
b=pop();
a=pop();
c=a-b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;
case '*':
b=pop();
a=pop();
c=a*b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;
case '/':
b=pop();
a=pop();
c=a/b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;

printf("\tContinue?(y/n):"); /*提示用户是否结束程序*/
l=getche();
if(l=='n')
exit(0);
while(1);

c语言关于栈中内存无法使用的问题

#include<stdio.h>
#include<stdlib.h>
#define append_size 10
typedef struct
int *base;
int *top;
int size;/*可用空间*/
Stack;
void InitStack(Stack *p)

p->top=(int *)malloc(append_size*sizeof(int));/*到这里就出问题了*/
p->base=p->top;
p->size=append_size;

void InsertItem(int item,Stack *p)

if(!p->size)

p->top=(int*)malloc(append_size*sizeof(int));
p->size=append_size;

*(p->top)=item;
p->top++;
p->size--;

void ShowStack(Stack *p)

int *old;
old=p->top;
while(p->top=p->base)

printf("%d\t",*(p->top));
p->top--;

p->top=old;

int main()

int temp,i;
Stack *s;
InitStack(s);
for(i=1;i<=5;i++)

printf("输入第%d个元素",i);
scanf("%d",&temp);
InsertItem(temp,s);

ShowStack(s);
return 0;

到了InitSqlist()就直接死掉了,显示“0x00401055"指令引用的"0xccccccd0"内存。该内存不能为“written"

是InitStack(s)吧?程序里就没有InitSqlist()。
因为栈内容没有初始化,所以访问那个s->top时就出错了,并不是分配内存的malloc的问题。
把主函数里这两行改一下:
Stack *s; /* 这里没有给s分配内存,这只是一个Stack的指针*/
InitStack(s);
改为:
Stack s; /* 这样就给s分配空间了, s.top现在就可以用了*/
InitStack(&s);
这个问题就好了。

相应地,以后使用栈时注意使用指针就好:
ShowStack(s);
改为
ShowStack(&s);

还有一种做法,就是在:
Stack *s;
InitStack(s);
中间给指针s分配内存,让指针s指向正确的结构:
Stack *s;
s = (Stack*)malloc(sizeof(Stack));
InitStack(s);
参考技术A Stack *s;这里的是一个指针,没有分配内存空间

以上是关于C语言版数据结构 关于四则运算的堆栈问题:请高人指出到底哪儿错了的主要内容,如果未能解决你的问题,请参考以下文章

c语言关于栈中内存无法使用的问题

C语言问题,利用堆栈实现四则运算,谢谢高手帮我编写出来

C语言问题,利用堆栈实现四则运算,谢谢高手帮我编写出来

线性表c语言实现 求高人完善

用堆栈来实现四则运算.(C语言)

请教会C语言的高人线性顺序表问题