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"
因为栈内容没有初始化,所以访问那个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语言版数据结构 关于四则运算的堆栈问题:请高人指出到底哪儿错了的主要内容,如果未能解决你的问题,请参考以下文章