数组栈
#include <stdio.h>
#include <stdlib.h>
typedef struct stack
{
int top;
char data[31];
} Stack;
typedef struct stack_num
{
int top;
float data[31];
} Stack_num;
void push(Stack *S, char x)
{
if (S->top < 30)
{
S->data[++S->top] = x;
}
return;
}
void push_num(Stack_num *S, float x)
{
if (S->top < 30)
{
S->data[++S->top] = x;
}
return;
}
char pop(Stack *S)
{
if (S->top == -1)
{
return 0;
}
else
{
return S->data[S->top--];
}
}
float pop_num(Stack_num *S)
{
if (S->top != -1)
{
return S->data[S->top--];
}
return 0;
}
int main()
{
Stack *S = (Stack *)malloc(sizeof(Stack));
S->top = -1;
char a[31];
char b[31];
gets(a);
char temp;
int i = 0, run = 0;
while (a[i])
{
if (a[i] >= '0' && a[i] <= '9')
{
b[run++] = a[i];
i++;
continue;
}
if (S->top == -1)
{
push(S, a[i]);
}
else if (a[i] == '+' || a[i] == '-')
{
temp = S->data[S->top];
while (temp != '(' && temp != 0)
{
temp = pop(S);
if (temp != '(' && temp != ')' && temp != 0)
b[run++] = temp;
}
push(S, a[i]);
}
else if (a[i] == '*' || a[i] == '/')
{
temp = S->data[S->top];
while (temp != 0 && temp != '(' && temp != '+' && temp != '-')
{
temp = pop(S);
if (temp != 0 && temp != '(' && temp != ')')
b[run++] = temp;
}
push(S, a[i]);
}
else if (a[i] == '(')
push(S, a[i]);
else if (a[i] == ')')
{
temp = S->data[S->top];
while (temp != 0 && temp != '(')
{
temp = pop(S);
if (temp != 0 && temp != '(' && temp != ')')
b[run++] = temp;
}
}
i++;
}
while (S->top != -1)
{
temp = pop(S);
if (temp != 0 && temp != '(' && temp != ')')
{
b[run++] = temp;
}
}
Stack_num *s = (Stack_num *)malloc(sizeof(Stack_num));
s->top = -1;
for (int k = 0; k < run; k++)
{
if (b[k] >= '0' && b[k] <= '9')
{
push_num(s, b[k] - '0');
}
else
{
float A = pop_num(s);
float B = pop_num(s);
if (b[k] == '+')
{
push_num(s, A + B);
}
else if (b[k] == '*')
{
push_num(s, A * B);
}
else if (b[k] == '/')
{
push_num(s, B / A);
}
else if (b[k] == '-')
{
push_num(s, B - A);
}
}
}
printf("%.2f\n", pop_num(s));
for (int k = 0; k < run - 1; k++)
{
printf("%c ", b[k]);
}
printf("%c", b[run - 1]);
return 0;
}
正确的链表栈
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node
{
char data;
struct Node *next;
} LinkStack;
typedef struct stack
{
float data[31];
int top;
} Stack_num;
void push(LinkStack *S, char x);
char pop(LinkStack *S);
void push_num(Stack_num *S, float x);
float pop_num(Stack_num *S);
int Judge(int flag, char option);
int main()
{
LinkStack *Stack = (LinkStack *)malloc(sizeof(LinkStack));
Stack->next = NULL;
char a[31];
char b[31];
gets(a);
int i = 0, run = 0;
while (a[i])
{
if (a[i] >= '0' && a[i] <= '9')
{
b[run++] = a[i];
i++;
continue;
}
while (!(Stack->next == NULL) && Judge(0, a[i]) < Judge(1, Stack->next->data))
b[run++] = pop(Stack);
if ((Stack->next == NULL))
{
push(Stack, a[i]);
i++;
continue;
}
else if (Judge(0, a[i]) > Judge(1, Stack->next->data))
{
push(Stack, a[i]);
}
else if (Judge(0, a[i]) == Judge(1, Stack->next->data))
{
pop(Stack);
}
i++;
}
while ((Stack->next != NULL))
{
b[run++] = pop(Stack);
}
b[run] = '\0';
Stack_num *S = (Stack_num *)malloc(sizeof(Stack_num));
S->top = -1;
for (int k = 0; k < run; k++)
{
if (b[k] != '+' && b[k] != '-' && b[k] != '*' && b[k] != '/')
{
push_num(S, b[k] - '0');
}
else
{
float A = pop_num(S);
float B = pop_num(S);
// printf("A=%f",A);
// printf("B=%f",B);
if (b[k] == '+')
{
float put = A + B;
push_num(S, put);
}
else if (b[k] == '-')
{
float put = B - A;
push_num(S, put);
}
else if (b[k] == '*')
{
float put = A * B;
push_num(S, put);
}
else if (b[k] == '/')
{
float put = B / A;
push_num(S, put);
}
}
}
float print = pop_num(S);
printf("%.2f\n", print);
for (int o = 0; o < run - 1; o++)
{
printf("%c ", b[o]);
}
printf("%c", b[run - 1]);
return 0;
}
void push(LinkStack *S, char x)
{
LinkStack *p = (LinkStack *)malloc(sizeof(LinkStack));
p->data = x;
p->next = NULL;
p->next = S->next;
S->next = p;
}
char pop(LinkStack *S)
{
if ((S->next != NULL))
{
LinkStack *temp = S->next;
S->next = temp->next;
char save = temp->data;
free(temp);
return save;
}
else
{
return '0';
}
}
void push_num(Stack_num *S, float x)
{
if (S->top + 1 < 31)
{
S->data[++S->top] = x;
}
else
{
return;
}
}
float pop_num(Stack_num *S)
{
if (S->top == -1)
{
return -1;
}
else
{
return S->data[S->top--];
}
}
int Judge(int flag, char option)
{
if (flag)
{
switch (option)
{
case '+':
return 3;
case '-':
return 3;
case '*':
return 5;
case '/':
return 5;
case '(':
return 1;
case ')':
return 6;
}
}
else
{
switch (option)
{
case '+':
return 2;
case '-':
return 2;
case '*':
return 4;
case '/':
return 4;
case '(':
return 6;
case ')':
return 1;
}
}
}
逻辑运算版本
#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
typedef struct Stack
{
char data[maxsize];
double numb[maxsize];
int top;
int bottom;
} Stack, *Pstack;
double getnum(char a, double b, double c);
void pop(Pstack s);
void push(Pstack s, char b);
void push2(Pstack s, double num);
int main()
{
double num;
char a[60];
char b[60];
for (int m = 0; m < 60; m++)
{
a[m] = b[m] = 0;
}
gets(a);
//scanf("%s", a);
Pstack f = (Pstack)malloc(sizeof(Stack));
f->top = f->bottom = 0;
int p = 0, q = 0;
while (a[p] != 0)
{
if (a[p] >= '0' && a[p] <= '9')
{
b[q] = a[p];
q++;
}
else
{
if (f->top == 0)
{
//f->top++;
push(f, a[p]);
}
else
{
if (a[p] == '(')
{
push(f, a[p]);
}
else if (a[p] == '+' || a[p] == '-')
{
while (f->top != 0 && f->data[f->top] != '(')
{
b[q] = f->data[f->top];
q++;
pop(f);
}
push(f, a[p]);
}
else if (a[p] == '*' || a[p] == '/')
{
while ((f->top != 0) && f->data[f->top] != '(' && f->data[f->top] != '+' && f->data[f->top] != '-')
{
b[q] = f->data[f->top];
q++;
pop(f);
}
push(f, a[p]);
}
else if (a[p] == ')')
{
while (f->data[f->top] != '(')
{
b[q] = f->data[f->top];
q++;
pop(f);
}
pop(f);
}
}
}
p++;
}
while (f->top != 0)
{
b[q] = f->data[f->top];
pop(f);
q++;
}
Pstack s = (Pstack)malloc(sizeof(Stack));
s->top = s->bottom = 0;
int i = 0;
while (b[i] != 0)
{
if (b[i] >= '0' && b[i] <= '9')
{
push2(s, b[i] - 48);
num=b[i]-48;
}
else
{
num = getnum(b[i], s->numb[s->top], s->numb[s->top - 1]);
pop(s);
pop(s);
push2(s, num);
}
i++;
}
printf("%.2lf\n", num);
int m = 0;
while (b[m] != 0)
{
printf("%c ", b[m]);
m++;
}
return 0;
}
double getnum(char a, double b, double c)
{
if (a == '+')
{
return c + b;
}
else if (a == '-')
{
return c - b;
}
else if (a == '*')
{
return b * c;
}
else if (a == '/')
{
return c / b;
}
}
void pop(Pstack s)
{
s->top--;
}
void push(Pstack s, char b)
{
s->top++;
s->data[s->top] = b;
}
void push2(Pstack s, double num)
{
s->top++;
s->numb[s->top] = num;
}