一、RPN.h
#ifndef __RPN_h__
#define __RPN_h__
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <Windows.h>
#define Initsize 5
#define Increment 2
typedef struct CStack
{
char* _array;
size_t _size;
size_t _capacity;
}CStack;
typedef struct IStack
{
int* _array;
size_t _size;
size_t _capacity;
}IStack;
void CStackInit(CStack* s);
void CCheckCapacity(CStack* s);
void CStackPush(CStack* s, char x);
void CStackPop(CStack* s);
char CStackTop(CStack* s);
int CStackEmpty(CStack* s);
void IStackInit(IStack* s);
void ICheckCapacity(IStack* s);
void IStackPush(IStack* s, int x);
void IStackPop(IStack* s);
int IStackTop(IStack* s);
int Precede(char top, char newnode);
void Infix_to_Suffix(char* p, char *arr);
int Count_Suffix(char *arr);
#endif __RPN_h__
二、RPN.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "RPN.h"
void CStackInit(CStack* s)
{
assert(s);
s->_size = 0;
s->_capacity = Initsize;
s->_array = (char*)malloc(Initsize*sizeof(char));
if (s->_array == NULL)
{
perror("StackInit");
return;
}
memset(s->_array, 0, s->_capacity * sizeof(char));
}
void CCheckCapacity(CStack* s)
{
assert(s);
if (s->_size >= s->_capacity)
{
char* ptr = (char*)realloc(s->_array, (s->_capacity + Increment)*sizeof(char));
if (ptr == NULL)
{
perror("CheckCapacity");
}
else
{
s->_array = ptr;
s->_capacity += Increment;
}
}
}
void CStackPush(CStack* s, char x)
{
assert(s);
CCheckCapacity(s);
s->_array[s->_size] = x;
s->_size++;
}
void CStackPop(CStack* s)
{
assert(s);
if (s->_size == 0)
{
printf("该栈为空\n");
}
else
{
s->_size--;
}
}
char CStackTop(CStack* s)
{
assert(s);
if (s->_size == 0)
{
printf("该栈为空\n");
return 0;
}
return s->_array[(s->_size) - 1];
}
int CStackEmpty(CStack* s)
{
assert(s);
if (s->_size)
{
return 0;
}
else
{
return 1;
}
}
void IStackInit(IStack* s)
{
assert(s);
s->_size = 0;
s->_capacity = Initsize;
s->_array = (int*)malloc(Initsize*sizeof(int));
if (s->_array == NULL)
{
perror("StackInit");
return;
}
memset(s->_array, 0, s->_capacity * sizeof(int));
}
void ICheckCapacity(IStack* s)
{
assert(s);
if (s->_size >= s->_capacity)
{
int* ptr = (int*)realloc(s->_array, (s->_capacity + Increment)*sizeof(int));
if (ptr == NULL)
{
perror("CheckCapacity");
}
else
{
s->_array = ptr;
s->_capacity += Increment;
}
}
}
void IStackPush(IStack* s, int x)
{
assert(s);
ICheckCapacity(s);
s->_array[s->_size] = x;
s->_size++;
}
void IStackPop(IStack* s)
{
assert(s);
if (s->_size == 0)
{
printf("该栈为空\n");
}
else
{
s->_size--;
}
}
int IStackTop(IStack* s)
{
assert(s);
if (s->_size == 0)
{
printf("该栈为空\n");
return 0;
}
return s->_array[(s->_size) - 1];
}
int Precede(char top, char newnode)
{
int i = 0;
if ((top == '+' || top == '-') && (newnode == '*' || newnode == '/'))
{
i = 1;
}
if (top == '(' || top == ')')
{
i = 1;
}
return i;
}
void Infix_to_Suffix(char* p, char *arr)
{
CStack s;
CStackInit(&s);
printf("逆波兰表达式为:");
while (*p)
{
if (*p >= '0' && *p <= '9')
{
int res = 0;
while (*p >= '0' && *p <= '9')
{
*(arr++) = *p;
res = res * 10 + *p - '0';
p++;
}
printf("%d ", res);
*(arr++) = ' ';
}
if (*p == '+' || *p == '-' || *p == '*' || *p == '/')
{
if (CStackEmpty(&s))
{
CStackPush(&s, *p);
}
else
{
char top = CStackTop(&s);
if (Precede(top, *p))
{
CStackPush(&s, *p);
}
else
{
while (Precede(top, *p) == 0)
{
printf("%c ", top);
*(arr++) = top;
*(arr++) = ' ';
CStackPop(&s);
if (!CStackEmpty(&s))
{
top = CStackTop(&s);
}
else
{
break;
}
}
CStackPush(&s, *p);
}
}
p++;
}
if (*p == '(')
{
CStackPush(&s, *p);
p++;
}
if (*p == ')')
{
if (!CStackEmpty(&s))
{
char top = CStackTop(&s);
while (top != '(')
{
printf("%c ", top);
*(arr++) = top;
*(arr++) = ' ';
CStackPop(&s);
top = CStackTop(&s);
}
CStackPop(&s);
}
p++;
}
}
while (!CStackEmpty(&s))
{
printf("%c ", CStackTop(&s));
*(arr++) = CStackTop(&s);
*(arr++) = ' ';
CStackPop(&s);
}
printf("\n");
*(arr++) = '#';
}
int Count_Suffix(char *arr)
{
IStack c;
IStackInit(&c);
while (*arr != '#')
{
if (*arr >= '0' && *arr <= '9')
{
int num = 0;
while (*arr >= '0' && *arr <= '9')
{
num = num * 10 + *arr - '0';
arr++;
}
IStackPush(&c, num);
}
else if (*arr == '+' || *arr == '-' || *arr == '*' || *arr == '/')
{
int right = IStackTop(&c);
IStackPop(&c);
int left = IStackTop(&c);
IStackPop(&c);
if (*arr == '+')
{
IStackPush(&c, left + right);
}
else if (*arr == '-')
{
IStackPush(&c, left - right);
}
else if (*arr == '*')
{
IStackPush(&c, left * right);
}
else if (*arr == '/')
{
IStackPush(&c, left / right);
}
arr++;
}
else
{
arr++;
}
}
return IStackTop(&c);
}
三、test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "RPN.h"
int main()
{
char *str = "12*((5-3)+6)-20/10";
char arr[100] = { 0 };
printf("原表达式为:%s\n", str);
Infix_to_Suffix(str,arr);
Count_Suffix(arr);
printf("计算结果是:%d\n", Count_Suffix(arr));
system("pause");
return 0;
}
执行结果
