473,729 Members | 2,376 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

convert infix to postfix

i've been working on this program forever! now i'm stuck and going
insane because i keep getting a syntax error msg and i just can't see
what the compiler is signaling to!

Expand|Select|Wrap|Line Numbers
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. /* constants */
  7. #define TRUE 1
  8. #define FALSE 0
  9.  
  10. /* structure for stack */
  11. typedef struct
  12. {
  13. char data[40];  /* array to hold stack contents */
  14. int tos;        /* top of the stack pointer */
  15. }
  16. STACK;
  17.  
  18. /* function prototypes */
  19. void initStack(STACK *stack);
  20. void get_infix(char infix[]);
  21. void convertToPostfix(char infix[], char postfix[]);
  22. int isOperator(char c);
  23. int precedence(char operator1, char operator2);
  24. int pred_level(char ch);
  25. void push(STACK *stack, char value);
  26. char pop(STACK *stack);
  27. char stackTop(STACK *stack);
  28. int isEmpty(STACK *stack);
  29. int isFull(STACK *stack);
  30. void printResult(char infix[], char postfix[]);
  31. void print_msg(void);
  32.  
  33. /* program entry point */
  34. int main()
  35. {
  36. char infix[40], postfix[40]="";
  37.  
  38. /* convert from infix to postfix main function */
  39. convertToPostfix(infix, postfix);
  40. /* display the postfix equivalent */
  41. infix[strlen(infix)-2] = '\0';
  42. printResult(infix, postfix);
  43.  
  44. return EXIT_SUCCESS;
  45. }
  46.  
  47. /* initalise the stack */
  48. void initStack(STACK *stack)
  49. {
  50. stack->tos = -1;  /* stack is initially empty */
  51. }
  52.  
  53. /* get infix expression from user */
  54. void get_infix(char infix[])
  55. {
  56. int i;
  57.  
  58. printf("Enter infix expression: ");
  59. fflush(stdin);
  60.  
  61. for ( i=0; i<40; )
  62. {
  63. if ( (infix[i] = getchar()) == '\n' )
  64. {
  65. i++;
  66. break;
  67. }
  68. else if ( !(isspace(infix[i])) )
  69. i++;
  70. }
  71.  
  72. infix[i] = '\0';
  73. }
  74.  
  75. /* convert the infix expression to postfix notation */
  76. void convertToPostfix(char infix[], char postfix[])
  77. {
  78. int i, length;
  79. int j=0;
  80. char tos_ch;
  81. STACK stack;
  82.  
  83. initStack(&stack); /* initialise stack */
  84. get_infix(infix);  /* get infix expression from user */
  85. length = strlen(infix);
  86.  
  87. if ( length )
  88. {
  89. push(&stack, '(');
  90. strcat(infix, ")");
  91. length++;
  92.  
  93. for ( i=0; i<length; i++ )
  94. {
  95. /* if current operator in infix is digit */
  96. if ( isdigit(infix[i]) )
  97. {
  98. postfix[j++] = infix[i];
  99. }
  100. /* if current operator in infix is left parenthesis */
  101. else if ( infix[i] == '(' )
  102. {
  103. push(&stack, '(');
  104. }
  105. /* if current operator in infix is operator */
  106. else if ( isOperator(infix[i]) )
  107. {
  108. while ( TRUE )
  109. {
  110. /* get tos */
  111. tos_ch = stackTop(&stack);
  112.  
  113. /* no stack left */
  114. if ( tos_ch == '\0' )
  115. {
  116. printf("\nFull Stack!\n");
  117. print_msg();
  118. exit(1);
  119. }
  120. else
  121. {
  122. if ( isOperator(tos_ch) )
  123. {
  124. if ( pred_level(tos_ch) >=
  125. pred_level(infix[i]) )
  126. postfix[j++] = pop(&stack);
  127. else
  128. break;
  129. }
  130. else
  131. break;
  132. }
  133. }
  134. push(&stack, infix[i]);
  135. }
  136. /* if current operator in infix is right parenthesis */
  137. else if ( infix[i] == ')' )
  138. {
  139. while ( TRUE )
  140. {
  141. /* get tos */
  142. tos_ch = stackTop(&stack);
  143.  
  144. /* no stack left */
  145. if ( tos_ch == '\0' )
  146. {
  147. printf("\nFull Stack!\n");
  148. print_msg();
  149. exit(1);
  150. }
  151. else
  152. {
  153. if ( tos_ch != '(' )
  154. {
  155. postfix[j++] = tos_ch;
  156. pop(&stack);
  157. }
  158. else
  159. {
  160. pop(&stack);
  161. break;
  162. }
  163. }
  164. }
  165. continue;
  166. }
  167. }
  168. }
  169.  
  170. postfix[j] = '\0';
  171. }
  172.  
  173. /* determine if c is an operator */
  174. switch (c) {
  175. case '+':
  176. return TRUE;
  177. break;
  178. case '-':
  179. return TRUE;
  180. break;
  181. case '*':
  182. return TRUE;
  183. break;
  184. case '/':
  185. return TRUE;
  186. break;
  187. default:
  188. return FALSE;
  189. break;
  190. /*if ( c == '+' || c == '-' || c == '*' ||
  191. c == '/' || c == '%' || c == '^' )
  192. {
  193. return TRUE;
  194. }
  195. else
  196. return FALSE; */
  197. }
  198.  
  199. /* determine precedence level */
  200. int pred_level(char ch)
  201. {
  202. if ( ch == '+' || ch == '-' )
  203. return 1;
  204. else
  205. return 2;
  206. }
  207.  
  208. /* determine if the precedence of operator1 is less than,
  209. equal to, greater than the precedence of operator2 */
  210. int precedence(char operator1, char operator2)
  211. {
  212. if ( pred_level(operator1) > pred_level(operator2) )
  213. return 1;
  214. else if ( pred_level(operator1) < pred_level(operator2) )
  215. return -1;
  216. else
  217. return 0;
  218. }
  219.  
  220. /* push a value on the stack */
  221. void push(STACK *stack, char value)
  222. {
  223. if ( !(isFull(stack)) )
  224. {
  225. (stack->tos)++;
  226. stack->data[stack->tos] = value;
  227. }
  228. }
  229.  
  230. /* pop a value off the stack */
  231. char pop(STACK *stack)
  232. {
  233. char ch;
  234.  
  235. if ( !(isEmpty(stack)) )
  236. {
  237. ch = stack->data[stack->tos];
  238. (stack->tos)--;
  239. return ch;
  240. }
  241. else
  242. return '\0';
  243. }
  244.  
  245. /* return the top value of the stack without popping the stack */
  246. char stackTop(STACK *stack)
  247. {
  248. if ( !(isEmpty(stack)) )
  249. return stack->data[stack->tos];
  250. else
  251. return '\0';
  252. }
  253.  
  254. /* determine if stack is empty */
  255. int isEmpty(STACK *stack)
  256. {
  257. /* empty */
  258. if ( stack->tos == -1 )
  259. return TRUE;
  260. /* not empty */
  261. else
  262. return FALSE;
  263. }
  264.  
  265. /* determine if stack is full */
  266. int isFull(STACK *stack)
  267. {
  268. /* full */
  269. if ( stack->tos == 19 )
  270. return TRUE;
  271. /* not full */
  272. else
  273. return FALSE;
  274. }
  275.  
  276. /* display the result postfix expression */
  277. void printResult(char infix[], char postfix[])
  278. {
  279. /*system("cls");*/
  280. printf("\n\n");
  281. printf("Infix notation: %d%s\n", infix);
  282. printf("Postfix notation: %d%s\n\n", postfix);
  283. print_msg();
  284. }
  285.  
  286. /* print exit message */
  287. void print_msg(void)
  288. {
  289. printf("Hit <RETURN> to exit...");
  290. fflush(stdin);
  291. getchar();
  292. }
  293.  
the error msg i get is: syntax error before "switch"

i don't get it :S ... any suggestions?

Nov 19 '05 #1
19 11304
ok i finally fixed the error!!! but the program outputs operators and
numbers, no variables

for example: if i input a*b+c*d/2 , it gives **2/+

so what now?

Nov 19 '05 #2
caramel wrote:
the error msg i get is: syntax error before "switch"

i don't get it :S ... any suggestions?


Which function is the switch statement supposed to be in?

--
pete
Nov 19 '05 #3

pete wrote:
caramel wrote:
the error msg i get is: syntax error before "switch"

i don't get it :S ... any suggestions?


Which function is the switch statement supposed to be in?

--

the switch is in void convertToPostfi x(char infix[], char postfix[])
what i want to know is where is 'c'. i've attempted to trace the
program state and can't find out where it is. You don't seem to pass it
as an argument. Also flushing stdin causes undefined behaviour, take
that out.

Nov 19 '05 #4
bitshadow wrote:

pete wrote:
caramel wrote:
the error msg i get is: syntax error before "switch"

i don't get it :S ... any suggestions?


Which function is the switch statement supposed to be in?

--

the switch is in void convertToPostfi x(char infix[], char postfix[])
what i want to know is where is 'c'.


Maybe that's where it's supposed to be,
which is what I asked, but that's not where it is.

I'd like to see an example of the output is supposed to be
for a given input.

--
pete
Nov 19 '05 #5
pete wrote:

bitshadow wrote:

pete wrote:
caramel wrote:

> the error msg i get is: syntax error before "switch"
>
> i don't get it :S ... any suggestions?

Which function is the switch statement supposed to be in?

--

the switch is in void convertToPostfi x(char infix[], char postfix[])
what i want to know is where is 'c'.


Maybe that's where it's supposed to be,
which is what I asked, but that's not where it is.


I think the switch is supposed to be in isOperator().
Where isOperator is, I don't know.

--
pete
Nov 19 '05 #6
well i fixed the switch, now i need to get it to print variables

it works as intended with numbers and operators, but for some reason it
does not print the variables entered to the console

Nov 19 '05 #7
caramel wrote:

well i fixed the switch, now i need to get it to print variables

it works as intended with numbers and operators,
but for some reason it
does not print the variables entered to the console


Probably has something to do with the current state of your code.

--
pete
Nov 19 '05 #8
true, i was wondering if anyone can point out any mistake(s) or suggest
a fragment of code i can insert to display variables

Nov 19 '05 #9
On 18 Nov 2005 15:42:10 -0800, "caramel" <es********@gma il.com> wrote:
i've been working on this program forever! now i'm stuck and going
insane because i keep getting a syntax error msg and i just can't see
what the compiler is signaling to!
snip/* convert the infix expression to postfix notation */
void convertToPostfi x(char infix[], char postfix[])
You did an excellent job of lining up all your braces.
{ snip if ( length )
{ snip for ( i=0; i<length; i++ )
{ snip if ( isdigit(infix[i]) )
{ snip } snip else if ( infix[i] == '(' )
{ snip } snip else if ( isOperator(infi x[i]) )
{
while ( TRUE )
{ snip if ( tos_ch == '\0' )
{ snip }
else
{
if ( isOperator(tos_ ch) )
{
if ( pred_level(tos_ ch) >= pred_level(infi x[i]) ) snip else snip }
else snip }
} snip } snip else if ( infix[i] == ')' )
{
while ( TRUE )
{ snip if ( tos_ch == '\0' )
{ snip }
else
{
if ( tos_ch != '(' )
{ snip }
else
{ snip }
}
} snip }
}
} snip}
This brace ends the function.

/* determine if c is an operator */
switch (c) {


You cannot put a switch statement (or most other statements) outside
of a function.

snip
<<Remove the del for email>>
Nov 19 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
5983
by: KidLogik | last post by:
Hello! I am converting an infix expression string into a postfix so that I will be able to evaluate it easier -> (5*(((9+8)*(4*6))+7)) == 598+46**7+* I believe the rule is "Replace all occurances of two operands followed by an operator by their infix equivalent"
22
3797
by: Tony Johansson | last post by:
Hello Experts! I'm reading i a book about C++ and they mention infix with telling what it is. I hope you out there can do so. Many thanks! //Tony
0
2905
by: stesia | last post by:
which is the programm of converting infix to postfix in c++ by using stacks? please help me...
30
5481
by: Xah Lee | last post by:
The Concepts and Confusions of Prefix, Infix, Postfix and Fully Functional Notations Xah Lee, 2006-03-15 In LISP languages, they use a notation like “(+ 1 2)” to mean “1+2”. Likewise, they write “(if test this that)” to mean “if (test) {this} else {that}”. LISP codes are all of the form “(a b c ...)”, where the
2
6699
by: ostorat_elwafa2 | last post by:
program that uses a stack to convert a given infix expression to a postfix expression and then to evaluate it. program should first check if the infix expression entered has balanced brackets ( (, , } ) and if not should produce an error. The program should handle at least the following operators (+, -, *, /, %). Assume the operands are single digit integers. thank you
3
5412
by: jackikay | last post by:
how do i write a program that converts infix to postfix.?
6
3034
by: jimmuel001 | last post by:
pls help me fo my assignment that will allow the user to input infinite equations in infix type. and will output in postfix. thanks!
1
6544
by: aitia | last post by:
this the code. i used ECLIPSE to run this.. it has some codes smells that i can't seem to figure out.. can any one help? import java.io.*; import java.util.*; public class Postfix { private static Stack operators = new Stack(); private static Stack operands = new Stack();
2
5604
by: zeroeight | last post by:
Hi guys, I'm a newbie here, I just want to seek for help regarding my program. I want to implement an infix to postfix conversion only accepting numbers. Right now, I already debugged the errors and encountering loop everytime I execute it. Here's my sample code: ******************************************************************** #include<stdio.h> #include<conio.h>
0
8917
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, well explore What is ONU, What Is Router, ONU & Routers main usage, and What is the difference between ONU and Router. Lets take a closer look ! Part I. Meaning of...
0
8761
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
9426
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
9142
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
4525
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
4795
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
3238
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
2680
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2163
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.