English 中文(简体)
Having many stacks with different types
原标题:

I m making a C program that needs to use two stacks. One needs to hold chars, the other needs to hold doubles. I have two structs, node and stack:

struct node {
    double value;
    struct node *next;
    struct node *prev;
};

struct stack {
    struct node *last;
    struct node *curr;
};

The problem is that I need one of each type. The only thing I can think of is having two separate structs (i.e., char_node, double_node, char_stack, double_stack). If this were C++ I d use templates, but of course I can t in C.

One thing I remember that could be used for this is a void pointer. Would that work, and would it be practical?

最佳回答

You could use a union.

Here some info on unions.

问题回答
  1. If you really want to use a linked list as a stack you do not need next and prev, just next. Neither do you need a tail/head pointer ( last in the example code). On a stack you only ever care about the top element.

  2. If you are implementing a stack to hold types like char and double, why not declare an array of each type and hold a pointer to the last valid element in the array? Then when you want to push onto the array you increment the pointer and set the value. To pop you do the reverse: get the value and decrement the pointer. Using an array means allocating all the memory you are likely to need in one fell swoop rather than every time you want to push a new node onto the stack.

Why not use a union?

struct node {
    union {
       double d_value;
       char c_value;
    } val;
    struct node *next;
    struct node *prev;
};

OK, but node structure you show seems to belong to double linked list, not a stack. Are you really thinking about stacking? Chains of linked nodes you show being allocated dynamically will eat your memory in a moment.

I d recommend you to reconsider base design of this. You should use memory more effective (maybe I don t know something about your special conditions but this is general approach. This really could lead to 2 separate stacks for objects of different type to keep data alignment (you won t like 1 byte chars mixed with 4 byte longs for example in plain memory area).

But this is only my opinion based on my experience with this, may it is useful in your situation ;).

If each stack only needs to hold a single data type, unions and void pointers are overkill. Make a DoubleStackNode and a CharStackNode -- this is what a C++ template (i.e. StackNode<T>) would do behind the scenes anyway.

Don t kill yourself trying to make some super-general catch-all solution. You only need two types of stacks.

You could use a union, but doing so will add substantial space overhead to your char stack.





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...

热门标签