#include <windows.h>
#include <iostream>
#include <stdlib.h>
#define MAXBUFFER 10
#define MAXLISTSIZE 100 //預設的存儲空間最大容量
using namespace std;
typedef struct{
char *base; //存儲空間基址
int *elem;
int top; //棧頂指針
int stacksize; //允許的最大存儲空間以元素為單位
}Stack;
void InitStack(Stack &S)
{
// 構造一個最大存儲容量為 maxsize 的空棧 S
int maxsize;
maxsize = MAXLISTSIZE;
S.base = new char[maxsize];
S.elem = new int[maxsize];
if (!S.base || !S.elem) exit(1); //存儲分配失敗
S.stacksize = maxsize;
S.top = 0; //空棧中元素個數為0
}
bool Push(Stack &S, char e)
{
// 若棧的存儲空間不滿,則插入元素 e 為新的棧頂元素,並返回 TRUE;否則返回 FALSE
if (S.top == S.stacksize) //棧已滿,無法進行插入
return FALSE;
S.base[S.top] = e; //插入新的元素
++S.top; //棧頂指針后移
return TRUE;
}
bool Push(Stack &S, int e)
{
// 若棧的存儲空間不滿,則插入元素 e 為新的棧頂元素,並返回 TRUE;否則返回 FALSE
if (S.top == S.stacksize) //棧已滿,無法進行插入
return FALSE;
S.base[S.top] = e; //插入新的元素
++S.top; //棧頂指針后移
return TRUE;
}
bool Pop(Stack &S, char &e)
{
//若棧不空,則刪除S的棧頂元素,用 e 返回其值,並返回 TRUE;否則返回 FALSE
if (S.top == 0)
return FALSE;
e = S.base[S.top-1]; //返回非空棧中棧頂元素
--S.top;//棧頂指針前移
return TRUE;
}
bool Pop(Stack &S, int &e)
{
//若棧不空,則刪除S的棧頂元素,用 e 返回其值,並返回 TRUE;否則返回 FALSE
if (S.top == 0)
return FALSE;
e = S.base[S.top-1]; //返回非空棧中棧頂元素
--S.top;//棧頂指針前移
return TRUE;
}
int StackLength(Stack S)
{
//返回S的元素個數,即棧的長度。
return S.top;
}
int main()
{
Stack S;
char c, e;
int d, f;
char a[100]; //存儲后綴表達式
char str[10]; //臨時緩沖區,存儲浮點數和多位數
int i = 0, j = 0;
InitStack(S);
cout << "請輸入中綴表達式,以#作為結束標志:";
cin >> c;
while(c != '#')
{
while((c >= '0' && c <= '9') || (c == '.'))
{
a[i++] = c;
cin >> c;
if((c < '0' || c > '9') && c != '.')
{
a[i++] = ' ';
}
}
if(')' == c)
{
Pop(S, e);
while('(' != e)
{
a[i++] = e;
a[i++] = ' ';
Pop(S, e);
}
}
else if('+' == c || '-' == c)
{
if(!StackLength(S))
{
Push(S, c);
}
else
{
do
{
Pop(S, e);
if('(' == e)
{
Push(S, e);
}
else
{
a[i++] = e;
a[i++] = ' ';
}
}while(StackLength(S) && '(' != e);
Push(S, c);
}
}
else if('*' == c || '/' == c || '(' == c)
{
Push(S, c);
}
else if('#' == c)
{
break;
}
else
{
cout << "輸入格式錯誤 << endl";
return -1;
}
cin >> c;
}
while(StackLength(S))
{
Pop(S, e);
a[i++] = e;
}
a[i++] = ' ';
a[i++] = '#';
j = i;
cout << "轉換的后綴表達式為:";
for(i=0; i<j; i++)
cout << a[i];
cout << endl;
i = 0, j =0;
c = a[i++];
while(c != '#')
{
while((c >= '0' && c <= '9') || c == '.')
{
str[j++] = c;
str[j] = '\0';
if(j >= 10)
{
cout << "出錯:輸入的數據過大 << endl";
return -1;
}
c = a[i++];
if(c == ' ')
{
d = atof(str);
Push(S, d);
j = 0;
break;
}
}
switch(c)
{
case '+':
Pop(S, f);
Pop(S, d);
Push(S, d+f);
break;
case '-':
Pop(S, f);
Pop(S, d);
Push(S, d-f);
break;
case '*':
Pop(S, f);
Pop(S, d);
Push(S, d*f);
break;
case '/':
Pop(S, f);
Pop(S, d);
if(f != 0)
{
Push(S, d/f);
}
else
{
cout << "錯誤:除數為0";
return -1;
}
break;
}
c = a[i++];
}
Pop(S, d);
cout << "表達式的結果為:" << d << endl;
}
